Skip to content

Commit

Permalink
Event: Don't break focus triggering after .on(focus).off(focus)
Browse files Browse the repository at this point in the history
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 e539bac)
  • Loading branch information
mgol committed May 10, 2021
1 parent 752b898 commit b3e4a7e
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 4 deletions.
8 changes: 4 additions & 4 deletions src/event.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
16 changes: 16 additions & 0 deletions test/unit/event.js
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down

0 comments on commit b3e4a7e

Please sign in to comment.