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
This commit is contained in:
parent
641ad80211
commit
6926247bf4
2 changed files with 49 additions and 19 deletions
31
src/event.js
31
src/event.js
|
@ -650,34 +650,27 @@ jQuery.Event.prototype = {
|
||||||
// Checks if an event happened on an element within another element
|
// Checks if an event happened on an element within another element
|
||||||
// Used in jQuery.event.special.mouseenter and mouseleave handlers
|
// Used in jQuery.event.special.mouseenter and mouseleave handlers
|
||||||
var withinElement = function( event ) {
|
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;
|
event.type = event.data;
|
||||||
|
|
||||||
// Firefox sometimes assigns relatedTarget a XUL element
|
if ( related !== this ) {
|
||||||
// which we cannot access the parentNode property of
|
|
||||||
try {
|
|
||||||
|
|
||||||
// Chrome does something similar, the parentNode property
|
if ( related ) {
|
||||||
// can be accessed but is null.
|
inside = jQuery.contains( this, related );
|
||||||
if ( parent && parent !== document && !parent.parentNode ) {
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Traverse up the tree
|
if ( !inside ) {
|
||||||
while ( parent && parent !== this ) {
|
|
||||||
parent = parent.parentNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( parent !== this ) {
|
|
||||||
// handle event if we actually just moused on to a non sub-element
|
|
||||||
jQuery.event.handle.apply( this, arguments );
|
jQuery.event.handle.apply( this, arguments );
|
||||||
}
|
|
||||||
|
|
||||||
// assuming we've left the element since we most likely mousedover a xul element
|
event.type = eventType;
|
||||||
} catch(e) { }
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// In case of event delegation, we only need to rename the event.type,
|
// In case of event delegation, we only need to rename the event.type,
|
||||||
|
|
|
@ -780,6 +780,43 @@ test("mouseover triggers mouseenter", function() {
|
||||||
elem.remove();
|
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() {
|
test("trigger() shortcuts", function() {
|
||||||
expect(6);
|
expect(6);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue