]> 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)
committerGitHub <noreply@github.com>
Mon, 10 May 2021 16:59:14 +0000 (18:59 +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

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

index 48ee8d174b39bf0ee17d4b88d97457662855bc11..4b6eb00e4fde107fcba89a1883c95bd81f3fffd8 100644 (file)
@@ -746,10 +746,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 edd9ecaead8a8796e2ce8bb2a60f5aa25a3577ac..1f76c54b9d08400af2a1e18200088b45819cabdb 100644 (file)
@@ -3325,6 +3325,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() {