fix for #4234. hover can take one function to use for both enter and leave.
[jquery.git] / src / event.js
index 4f63bae..ebf1231 100644 (file)
@@ -160,7 +160,7 @@ jQuery.event = {
                                                        break;
                                                }
                                                if ( !ret ) {
-                                                       if ( !this.special[ type ] || this.special[ type ].teardown.call( elem, namespaces ) === false ) {
+                                                       if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
                                                                if ( elem.removeEventListener ) {
                                                                        elem.removeEventListener( type, jQuery.data( elem, "handle" ), false );
                                                                } else if ( elem.detachEvent ) {
@@ -214,11 +214,11 @@ jQuery.event = {
                                event.stopPropagation();
                                // Only trigger if we've ever bound an event for it
                                if ( this.global[ type ] ) {
-                                       for ( var cached in jQuery.cache ) {
-                                               if ( cached.events && cached.events[ type ] ) {
-                                                       this.trigger( event, data, cached.handle.elem );
+                                       jQuery.each( jQuery.cache, function() {
+                                               if ( this.events && this.events[type] ) {
+                                                       jQuery.event.trigger( event, data, this.handle.elem );
                                                }
-                                       }
+                                       });
                                }
                        }
 
@@ -351,8 +351,8 @@ jQuery.event = {
                // Calculate pageX/Y if missing and clientX/Y available
                if ( event.pageX == null && event.clientX != null ) {
                        var doc = document.documentElement, body = document.body;
-                       event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
-                       event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc.clientTop  || 0);
+                       event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
+                       event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
                }
 
                // Add which for key events
@@ -388,14 +388,14 @@ jQuery.event = {
                        setup: bindReady,
                        teardown: function() {}
                },
-               
+
                live: {
                        add: function( proxy, data, namespaces ) {
                                jQuery.extend( proxy, data || {} );
                                proxy.guid += data.selector + data.live;
                                jQuery.event.add( this, data.live, liveHandler );
                        },
-                       
+
                        teardown: function( namespaces ) {
                                jQuery.event.remove( this, namespaces[0], liveHandler );
                        }
@@ -479,8 +479,11 @@ var withinElement = function( event ) {
        var parent = event.relatedTarget;
        // Traverse up the tree
        while ( parent && parent != this ) {
+               // Firefox sometimes assigns relatedTarget a XUL element
+               // which we cannot access the parentNode property of
                try { parent = parent.parentNode; }
-               catch(e) { parent = this; }
+               // assuming we've left the element since we most likely mousedover a xul element
+               catch(e) { break; }
        }
 
        if ( parent != this ) {
@@ -566,7 +569,7 @@ jQuery.fn.extend({
        },
 
        hover: function( fnOver, fnOut ) {
-               return this.mouseenter( fnOver ).mouseleave( fnOut );
+               return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
        },
 
        ready: function( fn ) {