// Make a writable jQuery.Event from the native event object
event = jQuery.event.fix( event || window.event );
- var i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related,
+ var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related,
handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
delegateCount = handlers.delegateCount,
args = [].slice.call( arguments ),
// Avoid non-left-click bubbling in Firefox (#3861)
if ( delegateCount && !(event.button && event.type === "click") ) {
- // Pregenerate a single jQuery object for reuse with .is()
- jqcur = jQuery(this);
- jqcur.context = this;
-
for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
// Don't process clicks (ONLY) on disabled elements (#6911, #8165, #xxxx)
if ( cur.disabled !== true || event.type !== "click" ) {
selMatch = {};
matches = [];
- jqcur[0] = cur;
for ( i = 0; i < delegateCount; i++ ) {
handleObj = handlers[ i ];
sel = handleObj.selector;
if ( selMatch[ sel ] === undefined ) {
- selMatch[ sel ] = jqcur.is( sel );
+ selMatch[ sel ] = jQuery( sel, this ).index( cur ) >= 0;
}
if ( selMatch[ sel ] ) {
matches.push( handleObj );
});
test( "delegated event with delegateTarget-relative selector", function() {
- expect(2);
- var markup = jQuery("<ul><li><a id=\"a0\"></a><ul id=\"ul0\"><li><a id=\"a0_0\"></a></li><li><a id=\"a0_1\"></a></li></ul></li></ul>").appendTo("#qunit-fixture");
+ expect(3);
+ var markup = jQuery("<ul><li><a id=\"a0\"></a><ul id=\"ul0\"><li class=test><a id=\"a0_0\"></a></li><li><a id=\"a0_1\"></a></li></ul></li></ul>").appendTo("#qunit-fixture");
+ // Positional selector (#11315)
markup
.on( "click", ">li>a", function() {
ok( this.id === "a0", "child li was clicked" );
})
.end()
.find("a").click().end()
- .remove();
+ .find("#ul0").off();
+
+ // Non-positional selector (#12383)
+ markup = markup.wrap("<div />").parent();
+ markup
+ .find("#ul0")
+ .on( "click", "div li a", function() {
+ ok( false, "div is ABOVE the delegation point!" );
+ })
+ .on( "click", "ul a", function() {
+ ok( false, "ul is the delegation point!" );
+ })
+ .on( "click", "li.test a", function() {
+ ok( true, "li.test is below the delegation point." );
+ })
+ .find("#a0_0").click();
+
+ markup.remove();
});
test("stopPropagation() stops directly-bound events on delegated target", function() {