]> source.dussan.org Git - jquery.git/commitdiff
Event: Don't break focus triggering after `.on(focus).off(focus)`
authorMichał Gołębiowski-Owczarek <m.goleb@gmail.com>
Mon, 10 May 2021 16:59:14 +0000 (18:59 +0200)
committerMichał Gołębiowski-Owczarek <m.goleb@gmail.com>
Mon, 10 May 2021 17:13:25 +0000 (19:13 +0200)
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)

src/event.js
test/unit/event.js

index a954400a38deb28c758ee96b1d171d9f087ee670..add100b842e5640b8fbb5c4e8a53b5873045e3d5 100644 (file)
@@ -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
index 252c0c8756cce7508b17bd4945a4746d9194f998..20102b0ebcfc99fac19b52b6f213f606cc39129c 100644 (file)
@@ -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 />" );
+
+       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() {