stopPropagation
предотвратит выполнение родительских обработчиков, stopImmediatePropagation
запретит выполнение любых родительских обработчиков, а также любых других обработчиков
Быстрый пример из документации jquery:
$("p").click(function(event) {
event.stopImmediatePropagation();
});
$("p").click(function(event) {
// This function won't be executed
$(this).css("background-color", "#f00");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>example</p>
Обратите внимание, что здесь важен порядок привязки события!
$("p").click(function(event) {
// This function will now trigger
$(this).css("background-color", "#f00");
});
$("p").click(function(event) {
event.stopImmediatePropagation();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>example</p>
Небольшой пример, чтобы продемонстрировать, как работают оба эти остановки распространения.
Показать фрагмент кода
Есть три связанных обработчика событий. Если мы не остановим распространение, то должно быть четыре оповещения - три для дочернего элемента div и одно для родительского элемента div.
Если мы остановим распространение события, то будет 3 оповещения (все на внутреннем дочернем элементе div). Поскольку событие не распространяется по иерархии DOM, родительский div не увидит его, и его обработчик не сработает.
Если мы немедленно остановим распространение, то будет только 1 предупреждение. Несмотря на то, что к внутреннему дочернему элементу div прикреплены три обработчика событий, выполняется только 1, и любое дальнейшее распространение немедленно прекращается, даже внутри одного и того же элемента.
источник
stopPropagation()
варианта также прекратят распространение по иерархии DOM. Не только вверх. Пожалуйста, проверьте мой ответ для деталей на этапе захвата.Из API jQuery :
Вкратце:
event.stopPropagation()
разрешает выполнение других обработчиков на том же элементе, в то же времяevent.stopImmediatePropagation()
предотвращает запуск каждого события.источник
event.stopImmediatePropagation
не перестает пузыриться, верно?stopImmediatePropagation
останавливает событие от периода распространения, оба они должны предотвращать всплывающее сообщение, ничего не стоит, что вы также можете изменить режим захвата, который будет запускать внешние элементы первым и только затем вниз к детям (пузыриться по умолчанию, и работает в направлении , противоположном)event.stopPropagation
предотвратит запуск обработчиков на родительских элементах.Вызов
event.stopImmediatePropagation
также предотвратит запуск других обработчиков на том же элементе.источник
Я опоздал, но, может быть, я могу сказать это на конкретном примере:
Скажем, если у вас есть
<table>
, с<tr>
, а потом<td>
. Теперь предположим, что вы установили 3 обработчика событий для<td>
элемента, затем, если вы сделаетеevent.stopPropagation()
первый обработчик событий, для которого вы установили<td>
, все обработчики событий для по-<td>
прежнему будут работать , но событие просто не будет распространяться на<tr>
или<table>
(и не будет идти и до<body>
,<html>
,document
иwindow
).Теперь, однако, если вы используете
event.stopImmediatePropagation()
в своем первом обработчике событий, то остальные два обработчика событий для<td>
не будет работать , и не будет распространяться до<tr>
,<table>
(и не будет идти и до<body>
,<html>
,document
, иwindow
).Обратите внимание, что это не только для
<td>
. Для других элементов это будет следовать тому же принципу.источник
1)
event.stopPropagation():
=> Используется только для остановки выполнения соответствующего родительского обработчика.2)
event.stopImmediatePropagation():
=> Используется для остановки выполнения соответствующего родительского обработчика, а также обработчика или функции, прикрепленной к себе, кроме текущего обработчика. => Также останавливает весь обработчик, прикрепленный к текущему элементу всего DOM.Вот пример: Jsfiddle !
Спасибо, -Сахил
источник
event.stopPropagation () позволяет выполнять другие обработчики на том же элементе, в то время как event.stopImmediatePropagation () предотвращает запуск каждого события. Например, см. Ниже блок кода jQuery.
Если в предыдущем примере было использовано event.stopPropagation, то сработает следующее событие щелчка на элементе p, который изменяет CSS, но в случае event.stopImmediatePropagation () следующее событие p щелчка не сработает.
источник
Удивительно, но все остальные ответы говорят только половину правды или на самом деле неверны!
e.stopImmediatePropagation()
останавливает вызов любого другого обработчика для этого события, без исключенийe.stopPropagation()
аналогично, но все же вызывает все обработчики для этой фазы на этом элементе, если он еще не вызванКакой этап?
Например, событие щелчка всегда будет сначала идти вниз по DOM (так называемая «фаза захвата»), в конце концов достигнет источника события («целевая фаза»), а затем снова всплывет («фаза пузыря»). И
addEventListener()
вы можете зарегистрировать несколько обработчиков для захвата и пузыря фазы независимо (Целевая фаза вызывает обработчики обоих типов на цели без различения.)И это то, что другие ответы неверны:
Скрипка и mozilla.org фазы событий объяснения с демо.
источник
Здесь я добавляю свой пример JSfiddle для stopPropagation против stopImmediatePropagation. JSFIDDLE
источник