Hmm. I've just found this thread after coding my own way around this
problem, now I feel a bit daft having seen some of the approaches
here. I found that Position.within() returns false if you move over a
child element of the element you're testing, so I looped over all
descendents of the parent, performing a within check on each and
storing a boolean flag (isWithin), which is checked and handled
accordingly once all within assessments are done. Probably very
expensive, but it seems to be working so far.
var isWithin = false;
function mouseHandler(evt) {
mouseX = Event.pointerX(evt);
mouseY = Event.pointerY(evt);
if (Position.within($('tab_menu'), mouseX, mouseY))
isWithin = true;
$('tab_menu').descendants().each(function(desc) {
if (Position.within(desc, mouseX, mouseY))
isWithin = true;
});
if (isWithin == false)
alert("we're not in kansas any more");
isWithin = false;
}
Ben
On May 11, 7:33 pm, David Dashifen Kees <[EMAIL PROTECTED]> wrote:
> Actually, I tested what you suggested, a list with an inner-list (or
> submenu), to see if it would work. Here's the html:
>
> <ul id="list">
> <li> 1
> <ul>
> <li>0</li>
> </ul>
> </li>
> <li> 2
> <ul>
> <li>0</li>
> <li>1</li>
> </ul>
> </li>
> <li> 3
> <ul>
> <li>0</li>
> <li>1</li>
> <li>2</li>
> </ul>
> </li>
> </ul>
>
> <script type="text/javascript">
> $("list").observe("mouseout", function(e) {
> if(Position.within($("list"), Event.pointerX(e),
> Event.pointerY(e))) return;
> alert("list out");
> });
> </script>
>
> It worked flawlessly. The alert box was only thrown when you leave the
> area of the ul#list, not when you leave any of the inner items or lists.
>
> - Dash -
>
> Jean-Philippe Encausse wrote:
> > Interresting !
>
> > In fact I have developped a very complicated Contextual Menu, with
> > multiple <ul><li>.
>
> > Because of this strange behavior, on mouseout, I set a timeout before
> > closing the menu.
>
> > Then if the mouse movein quickly the menu stay opened like an OS Menu.
>
> > There is one issue with your solution, you might have to check if
> > mouse is on a submenu (sub UL/LI) ?
>
> > On 5/11/07, David Dashifen Kees <[EMAIL PROTECTED]> wrote:
>
> >> Well done. I hadn't thought of that. Thanks for sharing!
> >> - Dash -
>
> >> Sudara wrote:
>
> >>> Hello.
>
> >>> I spent an hour or three chasing down a desired effect that mootools
> >>> implements, namely the simulation of onmouseleave and onmouseenter
> >>> events.
>
> >>> Why?
>
> >>> Lets say you have a Menu. A ul element that contains many li elements.
> >>> If you want to have a function (maybe an effect) fire when the mouse
> >>> moves outside of the ul, you are out of luck. Observe the mouseout
> >>> function like so:
>
> >>> Event.observe(nav, 'mouseout', function(e) {
> >>> // you would think this would work
> >>> alert('mouse is outside of nav?...');
> >>> });
>
> >>> and what actually happens is that every time the mouse leaves the
> >>> element OR crosses the boundary of a child element (li), the event is
> >>> fired.
>
> >>> Instead of implementing onmouseleave/onmouseenter the way that
> >>> mootools has it, I saw that the sweet prototype API has a Pointer
> >>> class.
>
> >>> I'm still a bit green with Prototype, but my answer came in this
> >>> shape:
>
> >>> Event.observe(nav, 'mouseout', function(e) {
> >>> if(!Position.within(nav,Event.pointerX(e),Event.pointerY(e))){
> >>> alert('...mouse is now truly outside nav...');
> >>> });
> >>> }
> >>> });
>
> >>> Have a good day!
> >>> Sudara
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby
on Rails: Spinoffs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/rubyonrails-spinoffs?hl=en
-~----------~----~----~----~------~----~------~--~---