mirror of
https://github.com/jquery/jquery.git
synced 2025-01-10 18:24:24 +00:00
Fix #8165: Ignore events bubbling through disabled elements.
Although #6911 fixed the case where event.target was disabled, it missed the case where the target was a sub-element.
This commit is contained in:
parent
2982abbb13
commit
8d9025ca50
38
src/event.js
38
src/event.js
@ -398,33 +398,37 @@ jQuery.event = {
|
||||
event.delegateTarget = this;
|
||||
|
||||
// Determine handlers that should run if there are delegated events
|
||||
// Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)
|
||||
if ( delegateCount && event.target.disabled !== true && !(event.button && event.type === "click") ) {
|
||||
// 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.ownerDocument || this;
|
||||
|
||||
for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
|
||||
selMatch = {};
|
||||
matches = [];
|
||||
jqcur[0] = cur;
|
||||
for ( i = 0; i < delegateCount; i++ ) {
|
||||
handleObj = handlers[ i ];
|
||||
sel = handleObj.selector;
|
||||
|
||||
// Don't process events on disabled elements (#6911, #8165)
|
||||
if ( cur.disabled !== true ) {
|
||||
selMatch = {};
|
||||
matches = [];
|
||||
jqcur[0] = cur;
|
||||
for ( i = 0; i < delegateCount; i++ ) {
|
||||
handleObj = handlers[ i ];
|
||||
sel = handleObj.selector;
|
||||
|
||||
if ( selMatch[ sel ] === undefined ) {
|
||||
selMatch[ sel ] = (
|
||||
handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
|
||||
);
|
||||
if ( selMatch[ sel ] === undefined ) {
|
||||
selMatch[ sel ] = (
|
||||
handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
|
||||
);
|
||||
}
|
||||
if ( selMatch[ sel ] ) {
|
||||
matches.push( handleObj );
|
||||
}
|
||||
}
|
||||
if ( selMatch[ sel ] ) {
|
||||
matches.push( handleObj );
|
||||
if ( matches.length ) {
|
||||
handlerQueue.push({ elem: cur, matches: matches });
|
||||
}
|
||||
}
|
||||
if ( matches.length ) {
|
||||
handlerQueue.push({ elem: cur, matches: matches });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1213,8 +1213,8 @@ test("Delegated events in SVG (#10791)", function() {
|
||||
svg.remove();
|
||||
});
|
||||
|
||||
test("Delegated events in forms (#10844; #11145)", function() {
|
||||
expect(2);
|
||||
test("Delegated events in forms (#10844; #11145; #8165)", function() {
|
||||
expect(3);
|
||||
|
||||
// Aliases names like "id" cause havoc
|
||||
var form = jQuery(
|
||||
@ -1246,6 +1246,16 @@ test("Delegated events in forms (#10844; #11145)", function() {
|
||||
.end()
|
||||
.off("submit");
|
||||
|
||||
form
|
||||
.append( '<button id="nestyDisabledBtn"><span>Zing</span></button>' )
|
||||
.on( "click", "#nestyDisabledBtn", function() {
|
||||
ok( true, "enabled/disabled button with nesty elements" );
|
||||
})
|
||||
.find( "span" ).trigger( "click" ).end() // yep
|
||||
.find( "#nestyDisabledBtn" ).prop( "disabled", true ).end()
|
||||
.find( "span" ).trigger( "click" ).end() // nope
|
||||
.off( "click" );
|
||||
|
||||
form.remove();
|
||||
});
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user