🌐 AI搜索 & 代理 主页
Skip to content

Commit 490db83

Browse files
cailloutimmywil
authored andcommitted
Event: stopPropagation() on native event-handler
Fixes gh-3693 Close gh-3694
1 parent 0bf499c commit 490db83

File tree

2 files changed

+58
-4
lines changed

2 files changed

+58
-4
lines changed

src/event/trigger.js

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,21 @@ define( [
1010

1111
"use strict";
1212

13-
var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
13+
var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
14+
stopPropagationCallback = function( e ) {
15+
e.stopPropagation();
16+
};
1417

1518
jQuery.extend( jQuery.event, {
1619

1720
trigger: function( event, data, elem, onlyHandlers ) {
1821

19-
var i, cur, tmp, bubbleType, ontype, handle, special,
22+
var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
2023
eventPath = [ elem || document ],
2124
type = hasOwn.call( event, "type" ) ? event.type : event,
2225
namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
2326

24-
cur = tmp = elem = elem || document;
27+
cur = lastElement = tmp = elem = elem || document;
2528

2629
// Don't do events on text and comment nodes
2730
if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
@@ -93,7 +96,7 @@ jQuery.extend( jQuery.event, {
9396
// Fire handlers on the event path
9497
i = 0;
9598
while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
96-
99+
lastElement = cur;
97100
event.type = i > 1 ?
98101
bubbleType :
99102
special.bindType || type;
@@ -136,7 +139,17 @@ jQuery.extend( jQuery.event, {
136139

137140
// Prevent re-triggering of the same event, since we already bubbled it above
138141
jQuery.event.triggered = type;
142+
143+
if ( event.isPropagationStopped() ) {
144+
lastElement.addEventListener( type, stopPropagationCallback );
145+
}
146+
139147
elem[ type ]();
148+
149+
if ( event.isPropagationStopped() ) {
150+
lastElement.removeEventListener( type, stopPropagationCallback );
151+
}
152+
140153
jQuery.event.triggered = undefined;
141154

142155
if ( tmp ) {

test/unit/event.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,47 @@ QUnit.test( "on bubbling, isDefaultPrevented, stopImmediatePropagation", functio
440440
$anchor2[ 0 ].removeEventListener( "click", neverCallMe );
441441
} );
442442

443+
QUnit.test( "triggered events stopPropagation() for natively-bound events", function( assert ) {
444+
assert.expect( 1 );
445+
446+
var $button = jQuery( "#button" ),
447+
$parent = $button.parent(),
448+
neverCallMe = function() {
449+
assert.ok( false, "propagation should have been stopped" );
450+
},
451+
stopPropagationCallback = function( e ) {
452+
assert.ok( true, "propagation is stopped" );
453+
e.stopPropagation();
454+
};
455+
456+
$parent[ 0 ].addEventListener( "click", neverCallMe );
457+
$button.on( "click", stopPropagationCallback );
458+
$button.trigger( "click" );
459+
$parent[ 0 ].removeEventListener( "click", neverCallMe );
460+
$button.off( "click", stopPropagationCallback );
461+
} );
462+
463+
QUnit.test( "trigger() works with events that were previously stopped", function( assert ) {
464+
assert.expect( 0 );
465+
466+
var $button = jQuery( "#button" ),
467+
$parent = $button.parent(),
468+
neverCallMe = function() {
469+
assert.ok( false, "propagation should have been stopped" );
470+
};
471+
472+
$parent[ 0 ].addEventListener( "click", neverCallMe );
473+
$button.on( "click", neverCallMe );
474+
475+
var clickEvent = jQuery.Event( "click" );
476+
clickEvent.stopPropagation();
477+
$button.trigger( clickEvent );
478+
479+
$parent[ 0 ].removeEventListener( "click", neverCallMe );
480+
$button.off( "click", neverCallMe );
481+
} );
482+
483+
443484
QUnit.test( "on(), iframes", function( assert ) {
444485
assert.expect( 1 );
445486

0 commit comments

Comments
 (0)