может кто-нибудь объяснить, как работает этот stopPropagation?

Я пытался настроить этот тип «когда вы щелкаете за пределами элемента, закрываете его», используя некоторый код, который я нашел в Stackoverflow:

$(document).click(function() {
 $('.list-to-hide').hide();
});

$('.show-list-button').click(function(event) {
 event.stopPropagation();
});

Может ли кто-нибудь объяснить последнюю часть с помощью stopPropagation? Я не понимаю, зачем это нужно.

Спасибо! Мэтт


person Matt    schedule 22.07.2011    source источник


Ответы (4)


Представьте себе это:

<div>
    DIV
    <span>
        Span
    </span>
<div>

и:

$('div').click(function() { alert('div clicked'); });
$('span').click(function() { alert('span clicked'); });

Проверьте, что происходит, когда вы нажимаете на каждый из них

Когда вы щелкаете по диапазону, он также запускает div, потому что вы также щелкаете по div.

Теперь, если мы хотим оповестить диапазон только, нам нужно предотвратить срабатывание щелчка div, когда мы нажимаем на диапазон, поэтому мы делаем это:

$('div').click(function() { alert('div clicked'); });
$('span').click(function(e) { alert('span clicked'); e.stopPropagation(); });

Посмотрите, что сейчас происходит

person qwertymk    schedule 22.07.2011
comment
Это действительно хорошая и простая для понимания демонстрация! Действительно полезно! - person Kumar; 05.12.2016

В вашем примере кода отсутствует важная часть:

$(document).click(function() {
    $('.list-to-hide').hide();
});

$('.show-list-button').click(function(event) {
    event.stopPropagation();
    $('.list-to-hide').show();
});

Без event.stopPropagation() он показывал бы список, а затем скрывал его, потому что .show-list-button находится внутри $(document), поэтому оба обработчика кликов будут срабатывать. event.stopPropagation() в основном говорит применять это событие щелчка только к ЭТОМУ ДОЧЕРНЕМУ УЗЛУ и ничего не сообщать родительским контейнерам, потому что я не хочу, чтобы они реагировали.

Подумайте об этом так: вы арендуете такси за 100 долларов. Водитель дает своей компании 80 долларов. event.stopPropagation() это все равно, что сказать ему оставить себе все 100 долларов, потому что компании не нужно ничего знать о поездке.

person AlienWebguy    schedule 22.07.2011
comment
Хорошо, это хорошее объяснение, но скажем, я нажимаю кнопку .show-list-button. Почему браузер сначала не воспринимает это как щелчок по документу? Есть ли какая-то система взвешивания, которую он использует, чтобы решить, какую функцию уведомить о щелчке в первую очередь? - person Matt; 22.07.2011
comment
Дополнительные материалы см. в разделе порядок событий и stackoverflow.com/questions/2661199/ - person Ghostoy; 22.07.2011
comment
У @Bohemian нет чувства юмора, и он проголосовал за этот ответ после того, как отредактировал его, назвав таксистом вместо проститутки. Уверен, твоя мама гордится твоими жизненными достижениями. - person AlienWebguy; 28.09.2015
comment
Я не минусовал. Вероятно, это был человек, который пометил ваш ответ как оскорбительный. - person Bohemian♦; 28.09.2015
comment
Проститутки не оскорбительны. Это совершенно субъективно. - person AlienWebguy; 29.09.2015

event.stopPropagation(); предотвращает всплытие события в DOM. Без этой строки при нажатии на .show-list-button обработчик щелчка для документа также сработает. С ним щелчок по документу не сработает.

person James Montagne    schedule 22.07.2011

Вы читали это?

http://api.jquery.com/event.stopPropagation/

Это предотвращает всплытие события вверх по дереву DOM, предотвращая уведомление родительских обработчиков о событии.

Пример

Убейте пузыри в событии клика.

$("p").click(function(event){
  event.stopPropagation();
  // do something
}); 
person Warface    schedule 22.07.2011