From 2fadbc0a9839893f434cfca42587593c8794375d Mon Sep 17 00:00:00 2001 From: Michał Gołębiowski-Owczarek Date: Mon, 7 Dec 2020 20:28:44 +0100 Subject: Event: Make focus re-triggering not focus the original element back If during a focus handler another focus event is triggered: ```js elem1.on( "focus", function() { elem2.trigger( "focus" ); } ); ``` due to their synchronous nature everywhere outside of IE the hack added in gh-4279 to leverage native events causes the native `.focus()` method to be called last for the initial element, making it steal the focus back. Since the native method is already being called in `leverageNative`, we can skip that final call. This aligns with changes to the `_default` method for the `click` event that were added when `leverageNative` was introduced there. A side effect of this change is that now `focusin` will only propagate to the document for the last focused element. This is a change in behavior but it also aligns us better with how this works with native methods. Fixes gh-4382 Closes gh-4813 Ref gh-4279 (cherry picked from commit dbcffb396c2db61ff96edc4162602e850797d61f) --- src/event.js | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src') diff --git a/src/event.js b/src/event.js index 5e2cee0e5..a954400a3 100644 --- a/src/event.js +++ b/src/event.js @@ -778,6 +778,12 @@ 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; + }, + delegateType: delegateType }; } ); -- cgit v1.2.3