diff options
Diffstat (limited to 'src/event.js')
-rw-r--r-- | src/event.js | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/src/event.js b/src/event.js index b63b93b96..48d9095c9 100644 --- a/src/event.js +++ b/src/event.js @@ -554,9 +554,13 @@ function leverageNative( el, type, expectSync ) { if ( ( event.isTrigger & 1 ) && this[ type ] ) { // 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 + // 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 ); dataPriv.set( this, type, saved ); @@ -569,14 +573,14 @@ function leverageNative( el, type, expectSync ) { if ( saved !== result || notAsync ) { dataPriv.set( this, type, false ); } else { - result = undefined; + result = {}; } if ( saved !== result ) { // Cancel the outer synthetic event event.stopImmediatePropagation(); event.preventDefault(); - return result; + return result.value; } // 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 // Fire an inner synthetic event with the original arguments - } else if ( saved ) { + } else if ( saved.length ) { // ...and capture the result - dataPriv.set( this, type, jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved.shift(), jQuery.Event.prototype ), - saved, - this - ) ); + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); // Abort handling of the native event event.stopImmediatePropagation(); |