From 6926247bf441deaa0441872849bb3786c257a4cf Mon Sep 17 00:00:00 2001 From: rwldrn Date: Tue, 14 Jun 2011 15:38:46 -0400 Subject: [PATCH] Landing pull request 397. withinElement rewrite in event. Fixes #6234, #9357, #9447. 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 | 31 ++++++++++++------------------- test/unit/event.js | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 19 deletions(-) diff --git a/src/event.js b/src/event.js index 3f53ab5c2..131739b1a 100644 --- a/src/event.js +++ b/src/event.js @@ -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; - // set the correct event type + // Check if mouse(over|out) are still within the same parent element + var related = event.relatedTarget, + inside = false, + eventType = 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, diff --git a/test/unit/event.js b/test/unit/event.js index f71c7b29f..7c628880b 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -780,6 +780,43 @@ test("mouseover triggers mouseenter", function() { elem.remove(); }); +test("withinElement implemented with jQuery.contains()", function() { + + expect(1); + + jQuery("#qunit-fixture").append('
'); + + 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);