mirror of
https://github.com/jquery/jquery.git
synced 2024-11-23 02:54:22 +00:00
Event: Fix handling of multiple async focus events
(cherry-picked from 24d71ac704
)
Fixes gh-4350
Closes gh-4354
This commit is contained in:
parent
b8d4712825
commit
ddfa837664
22
src/event.js
22
src/event.js
@ -554,9 +554,13 @@ function leverageNative( el, type, expectSync ) {
|
|||||||
if ( ( event.isTrigger & 1 ) && this[ type ] ) {
|
if ( ( event.isTrigger & 1 ) && this[ type ] ) {
|
||||||
|
|
||||||
// Interrupt processing of the outer synthetic .trigger()ed event
|
// Interrupt processing of the outer synthetic .trigger()ed event
|
||||||
if ( !saved ) {
|
// Saved data should be false in such cases, but might be a leftover capture object
|
||||||
|
// from an async native handler (gh-4350)
|
||||||
|
if ( !saved.length ) {
|
||||||
|
|
||||||
// Store arguments for use when handling the inner native event
|
// Store arguments for use when handling the inner native event
|
||||||
|
// There will always be at least one argument (an event object), so this array
|
||||||
|
// will not be confused with a leftover capture object.
|
||||||
saved = slice.call( arguments );
|
saved = slice.call( arguments );
|
||||||
dataPriv.set( this, type, saved );
|
dataPriv.set( this, type, saved );
|
||||||
|
|
||||||
@ -569,14 +573,14 @@ function leverageNative( el, type, expectSync ) {
|
|||||||
if ( saved !== result || notAsync ) {
|
if ( saved !== result || notAsync ) {
|
||||||
dataPriv.set( this, type, false );
|
dataPriv.set( this, type, false );
|
||||||
} else {
|
} else {
|
||||||
result = undefined;
|
result = {};
|
||||||
}
|
}
|
||||||
if ( saved !== result ) {
|
if ( saved !== result ) {
|
||||||
|
|
||||||
// Cancel the outer synthetic event
|
// Cancel the outer synthetic event
|
||||||
event.stopImmediatePropagation();
|
event.stopImmediatePropagation();
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
return result;
|
return result.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If this is an inner synthetic event for an event with a bubbling surrogate
|
// If this is an inner synthetic event for an event with a bubbling surrogate
|
||||||
@ -591,17 +595,19 @@ function leverageNative( el, type, expectSync ) {
|
|||||||
|
|
||||||
// If this is a native event triggered above, everything is now in order
|
// If this is a native event triggered above, everything is now in order
|
||||||
// Fire an inner synthetic event with the original arguments
|
// Fire an inner synthetic event with the original arguments
|
||||||
} else if ( saved ) {
|
} else if ( saved.length ) {
|
||||||
|
|
||||||
// ...and capture the result
|
// ...and capture the result
|
||||||
dataPriv.set( this, type, jQuery.event.trigger(
|
dataPriv.set( this, type, {
|
||||||
|
value: jQuery.event.trigger(
|
||||||
|
|
||||||
// Support: IE <=9 - 11+
|
// Support: IE <=9 - 11+
|
||||||
// Extend with the prototype to reset the above stopImmediatePropagation()
|
// Extend with the prototype to reset the above stopImmediatePropagation()
|
||||||
jQuery.extend( saved.shift(), jQuery.Event.prototype ),
|
jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
|
||||||
saved,
|
saved.slice( 1 ),
|
||||||
this
|
this
|
||||||
) );
|
)
|
||||||
|
} );
|
||||||
|
|
||||||
// Abort handling of the native event
|
// Abort handling of the native event
|
||||||
event.stopImmediatePropagation();
|
event.stopImmediatePropagation();
|
||||||
|
@ -3041,6 +3041,49 @@ QUnit.test( "focus-blur order (#12868)", function( assert ) {
|
|||||||
}, 50 );
|
}, 50 );
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
QUnit.test( "Event handling works with multiple async focus events (gh-4350)", function( assert ) {
|
||||||
|
assert.expect( 3 );
|
||||||
|
|
||||||
|
var remaining = 3,
|
||||||
|
input = jQuery( "#name" ),
|
||||||
|
|
||||||
|
// Support: IE <=9 - 11+
|
||||||
|
// focus and blur events are asynchronous; this is the resulting mess.
|
||||||
|
// The browser window must be topmost for this to work properly!!
|
||||||
|
done = assert.async();
|
||||||
|
|
||||||
|
input
|
||||||
|
.on( "focus", function() {
|
||||||
|
remaining--;
|
||||||
|
assert.ok( true, "received focus event, expecting " + remaining + " more" );
|
||||||
|
if ( remaining > 0 ) {
|
||||||
|
input.trigger( "blur" );
|
||||||
|
} else {
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
} )
|
||||||
|
.on( "blur", function() {
|
||||||
|
setTimeout( function() {
|
||||||
|
input.trigger( "focus" );
|
||||||
|
} );
|
||||||
|
} );
|
||||||
|
|
||||||
|
// gain focus
|
||||||
|
input.trigger( "focus" );
|
||||||
|
|
||||||
|
// DOM focus is unreliable in TestSwarm
|
||||||
|
setTimeout( function() {
|
||||||
|
if ( QUnit.isSwarm && remaining === 3 ) {
|
||||||
|
assert.ok( true, "GAP: Could not observe focus change" );
|
||||||
|
assert.ok( true, "GAP: Could not observe focus change" );
|
||||||
|
assert.ok( true, "GAP: Could not observe focus change" );
|
||||||
|
setTimeout( function() {
|
||||||
|
done();
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
} );
|
||||||
|
|
||||||
QUnit.test( "native-backed events preserve trigger data (gh-1741, gh-4139)", function( assert ) {
|
QUnit.test( "native-backed events preserve trigger data (gh-1741, gh-4139)", function( assert ) {
|
||||||
assert.expect( 17 );
|
assert.expect( 17 );
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user