]> source.dussan.org Git - jquery.git/commitdiff
Landing pull request 397. withinElement rewrite in event. Fixes #6234, #9357, #9447.
authorrwldrn <waldron.rick@gmail.com>
Tue, 14 Jun 2011 19:38:46 +0000 (15:38 -0400)
committertimmywil <tim.willison@thisismedium.com>
Tue, 14 Jun 2011 19:38:46 +0000 (15:38 -0400)
More Details:
 - https://github.com/jquery/jquery/pull/397
 - http://bugs.jquery.com/ticket/6234
 - http://bugs.jquery.com/ticket/9357
 - http://bugs.jquery.com/ticket/9447

src/event.js
test/unit/event.js

index 3f53ab5c2e3971385d1b2c9a2ccbb4ec664f3b7f..131739b1afac3410d585fe2fcb33f06cff4157bf 100644 (file)
@@ -650,34 +650,27 @@ jQuery.Event.prototype = {
 // Checks if an event happened on an element within another element
 // Used in jQuery.event.special.mouseenter and mouseleave handlers
 var withinElement = function( event ) {
+
        // Check if mouse(over|out) are still within the same parent element
-       var parent = event.relatedTarget;
+       var related = event.relatedTarget,
+               inside = false,
+               eventType = event.type;
 
-       // set the correct event type
        event.type = event.data;
 
-       // Firefox sometimes assigns relatedTarget a XUL element
-       // which we cannot access the parentNode property of
-       try {
+       if ( related !== this ) {
 
-               // Chrome does something similar, the parentNode property
-               // can be accessed but is null.
-               if ( parent && parent !== document && !parent.parentNode ) {
-                       return;
+               if ( related ) {
+                       inside = jQuery.contains( this, related );
                }
 
-               // Traverse up the tree
-               while ( parent && parent !== this ) {
-                       parent = parent.parentNode;
-               }
+               if ( !inside ) {
 
-               if ( parent !== this ) {
-                       // handle event if we actually just moused on to a non sub-element
                        jQuery.event.handle.apply( this, arguments );
-               }
 
-       // assuming we've left the element since we most likely mousedover a xul element
-       } catch(e) { }
+                       event.type = eventType;
+               }
+       }
 },
 
 // In case of event delegation, we only need to rename the event.type,
index f71c7b29feff56b3948fe26c8ee246cf2a06c4d1..7c628880b438b0ee4ac8e42f2c4171570afc1909 100644 (file)
@@ -780,6 +780,43 @@ test("mouseover triggers mouseenter", function() {
        elem.remove();
 });
 
+test("withinElement implemented with jQuery.contains()", function() {
+
+       expect(1);
+
+       jQuery("#qunit-fixture").append('<div id="jc-outer"><div id="jc-inner"></div></div>');
+
+       jQuery("#jc-outer").bind("mouseenter mouseleave", function( event ) {
+
+               equal( this.id, "jc-outer", this.id + " " + event.type );
+
+       }).trigger("mouseenter");
+
+       jQuery("#jc-inner").trigger("mousenter");
+
+       jQuery("#jc-outer").unbind("mouseenter mouseleave").remove();
+       jQuery("#jc-inner").remove();
+
+});
+
+test("mouseenter, mouseleave don't catch exceptions", function() {
+       expect(2);
+
+       var elem = jQuery("#firstp").hover(function() { throw "an Exception"; });
+
+       try {
+               elem.mouseenter();
+       } catch (e) {
+               equals( e, "an Exception", "mouseenter doesn't catch exceptions" );
+       }
+
+       try {
+               elem.mouseleave();
+       } catch (e) {
+               equals( e, "an Exception", "mouseleave doesn't catch exceptions" );
+       }
+});
+
 test("trigger() shortcuts", function() {
        expect(6);