diff options
author | Dave Methvin <dave.methvin@gmail.com> | 2012-01-19 22:14:24 -0500 |
---|---|---|
committer | Dave Methvin <dave.methvin@gmail.com> | 2012-01-19 22:14:24 -0500 |
commit | 8d9025ca50603e5404c6b50f7fa6c87046ee24c1 (patch) | |
tree | 7ee72835aee4e9df9db426f2a1158afb224b5002 | |
parent | 2982abbb13454bd4bdf0299f1183fb0d8c02f02d (diff) | |
download | jquery-8d9025ca50603e5404c6b50f7fa6c87046ee24c1.tar.gz jquery-8d9025ca50603e5404c6b50f7fa6c87046ee24c1.zip |
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.
-rw-r--r-- | src/event.js | 40 | ||||
-rw-r--r-- | test/unit/event.js | 14 |
2 files changed, 34 insertions, 20 deletions
diff --git a/src/event.js b/src/event.js index c675937a3..63dd7da6b 100644 --- a/src/event.js +++ b/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; - - if ( selMatch[ sel ] === undefined ) { - selMatch[ sel ] = ( - handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) - ); + + // 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 ] ) { + 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 }); - } } } diff --git a/test/unit/event.js b/test/unit/event.js index 0932ce816..4c1901664 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -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(); }); |