From: Michał Gołębiowski-Owczarek Date: Mon, 10 May 2021 16:59:14 +0000 (+0200) Subject: Event: Don't break focus triggering after `.on(focus).off(focus)` X-Git-Tag: 3.6.1~32 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=b3e4a7eb16f68586e25a1f27f7f7c5ecba013261;p=jquery.git Event: Don't break focus triggering after `.on(focus).off(focus)` The `_default` function in the special event settings for focus/blur has always returned `true` since gh-4813 as the event was already being fired from `leverageNative`. However, that only works if there's an active handler on that element; this made a quick consecutive call: ```js elem.on( "focus", function() {} ).off( "focus" ); ``` make subsequent `.trigger( "focus" )` calls to not do any triggering. The solution, already used in a similar `_default` method for the `click` event, is to check for the `dataPriv` entry on the element for the focus event (similarly for blur). Fixes gh-4867 Closes gh-4885 (cherry picked from commit e539bac79e666bba95bba86d690b4e609dca2286) --- diff --git a/src/event.js b/src/event.js index a954400a3..add100b84 100644 --- a/src/event.js +++ b/src/event.js @@ -778,10 +778,10 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp return true; }, - // Suppress native focus or blur as it's already being fired - // in leverageNative. - _default: function() { - return true; + // Suppress native focus or blur if we're currently inside + // a leveraged native-event stack + _default: function( event ) { + return dataPriv.get( event.target, type ); }, delegateType: delegateType diff --git a/test/unit/event.js b/test/unit/event.js index 252c0c875..20102b0eb 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -3297,6 +3297,22 @@ QUnit.test( "focus change during a focus handler (gh-4382)", function( assert ) } ); } ); +QUnit.test( "trigger(focus) works after .on(focus).off(focus) (gh-4867)", function( assert ) { + assert.expect( 1 ); + + var input = jQuery( "" ); + + input.appendTo( "#qunit-fixture" ); + + input + .on( "focus", function() {} ) + .off( "focus" ); + + input.trigger( "focus" ); + + assert.equal( document.activeElement, input[ 0 ], "input has focus" ); +} ); + // TODO replace with an adaptation of // https://github.com/jquery/jquery/pull/1367/files#diff-a215316abbaabdf71857809e8673ea28R2464 ( function() {