Всплывающие события jQuery

Я хочу понять, как именно интерпретировать пузырение. Означает ли это подъем вверх по иерархии HTML-кода или что-то еще?

Во-вторых, я просматривал пример и не мог понять последнюю часть, где он говорит

Обработчик щелчков на основе P прослушивает событие щелчка, а затем предотвращает его распространение (всплывание).

Что это значит?


person copenndthagen    schedule 04.08.2011    source источник


Ответы (7)


return false;

предотвратит «пузырение». Он используется для остановки действий по умолчанию, таких как установка флажка, открытие выбора, щелчок и т. д.

Чтобы остановить выполнение других обработчиков после одной привязки с использованием .live(), обработчик должен вернуть false. Вызов .stopPropagation() этого не сделает.

Из Предостережения в jQuery .live()


Аргументация (спасибо @AlienWebguy):

Причина, по которой stopPropagation() не работает с live(), заключается в том, что live() привязывает событие к документу, поэтому к тому времени, когда оно срабатывает, ему больше некуда распространяться.

person Joe    schedule 04.08.2011
comment
Хм... звучит немного запутанно... Итак, нужно ли возвращать false или stopPropogation(), чтобы остановить всплытие событий? - person copenndthagen; 04.08.2011
comment
@test, верни false - это ответ - person Joe; 04.08.2011
comment
Хм... интересно... в большинстве других ответов говорится: e.stopPropagation(); и вы говорите, что возвращаете false.. может потребоваться проверка с помощью примера jsfiddle... - person copenndthagen; 04.08.2011
comment
@test, согласно документации jQuery в прямом эфире, e.stopPropagation() недостаточно. Я уверен, что это работает в Chrome или где-то еще, но если вы хотите, чтобы истинная поддержка кросс-браузера возвращала false. Это прямо из документации jQuery. - person Joe; 04.08.2011
comment
вернуть false не остановить пузырение - person Sameh Serag; 16.05.2012
comment
Это было полезно для меня! Почему-то в моем конкретном случае e.preventDefault(); e.stopPropagation(); мне не помогло (хотя в большинстве случаев вроде бы и так). - person Ryan; 20.02.2013
comment
Причина, по которой stopPropagation() не работает с live(), заключается в том, что live() связывает событие с document, поэтому к тому времени, когда оно срабатывает, ему больше некуда распространяться. - person AlienWebguy; 22.03.2013

Концепция «всплывания» аналогична ситуации, когда у вас есть дочерний элемент с событием щелчка, и вы не хотите, чтобы он вызывал событие щелчка родительского элемента. Вы можете использовать event.stopPropagation().

event.stopPropagation() в основном говорит, что это событие щелчка следует применять только к ЭТОМУ ДОчернему узлу и ничего не сообщать родительским контейнерам, потому что я не хочу, чтобы они реагировали.

Захват событий:

               | |
---------------| |-----------------
| element1     | |                |
|   -----------| |-----------     |
|   |element2  \ /          |     |
|   -------------------------     |
|        Event CAPTURING          |
-----------------------------------

Всплывающие события:

               / \
---------------| |-----------------
| element1     | |                |
|   -----------| |-----------     |
|   |element2  | |          |     |
|   -------------------------     |
|        Event BUBBLING           |
-----------------------------------

Если вы используете live() или delegate(), вам потребуется return false;, хотя это может и не сработать. Прочитайте цитату ниже.

Согласно документам jQuery:

Поскольку метод .live() обрабатывает события после их распространения в начало документа, невозможно остановить распространение живых событий. Точно так же события, обрабатываемые .delegate(), будут распространяться на элементы, которым они делегированы; обработчики событий, привязанные к любым элементам ниже него в дереве DOM, уже будут выполнены к моменту вызова делегированного обработчика событий. Таким образом, эти обработчики могут предотвратить срабатывание делегированного обработчика, вызвав event.stopPropagation() или вернув false.

В прошлом это была проблема с платформой, в Internet Explorer использовалась пузырчатая модель, а Netscape был больше связан с захватом (но поддерживал и то, и другое).

модель W3C требует, чтобы вы могли выбирать, какие тот, который вы хотите.

Я думаю, что всплывающее окно более популярно, потому что, как уже говорилось, есть некоторые платформы, которые поддерживают только всплывающее окно... и это имеет смысл как режим «по умолчанию».

Какой из них вы выберете, во многом зависит от того, что вы делаете и что имеет для вас смысл.

Дополнительная информация http://www.quirksmode.org/js/events_order.html

Еще один отличный ресурс: http://fuelyourcoding.com/jquery-events-stop-misusing-return-false/

person AlienWebguy    schedule 04.08.2011
comment
Все это время даже не знал, что что-то подобное существует. +1 за то, что позволил мне узнать что-то новое! - person Mrchief; 04.08.2011
comment
Вы, вероятно, найдете это изображение (из спецификации W3c DOM Level 3 Events) полезным: i.imgur.com /qlV9Z.png - person ; 04.08.2011

В нем говорится, что метод live () прикрепляет обработчик к элементу document и проверяет target события, чтобы узнать, откуда оно исходит. Если цель соответствует селектору, она запускает обработчик событий. Все это опирается на бурлящую систему событий.

В примере обработчик щелчка по элементу p, который является предком элемента a, отменяет всплытие, возвращая false. Тогда элемент document никогда не получит событие, поэтому он не вызовет обработчик события.

person Johnny5    schedule 04.08.2011
comment
Я пытался сформулировать что-то вроде этого, вы меня опередили. - person karim79; 04.08.2011
comment
Perfetto ... это то, что я искал ... хотя 1-й абзац немного сложен для понимания, я думаю, мне придется прочитать его несколько раз, чтобы понять ... Но дело в том, что у вас есть действительно ответил в соответствии с моим вопросом ... - person copenndthagen; 04.08.2011
comment
Ну, я не англичанин по рождению, поэтому иногда мои предложения трудно понять... - person Johnny5; 04.08.2011
comment
Ну... когда я сказал, что это сложно понять, я не имел в виду английский язык... Некоторые концепции трудно объяснить... Но вы определенно объяснили это НАИЛУЧШИМ СПОСОБОМ... уверен, что даже превзойдете любой английский язык. парень... и кстати...даже я не англичанин по рождению.. - person copenndthagen; 05.08.2011

В приведенном ниже примере он прикрепляет событие клика к якорю с идентификатором «якорь». Этот якорь находится внутри div, к которому также прикреплено событие клика. Если мы нажмем на этот якорь, это так же хорошо, как мы нажмем на содержащий его div. Теперь, если мы хотим сделать что-то с этим щелчком привязки, но не хотим, чтобы щелчок div срабатывал, мы можем остановить всплытие события, как показано ниже.

<div id="div">

<a href="google.com" id="anchor"></a>

</div>


$("#div").click(function(e){//On anchor click this event will not be fired as we have stop the event propagation in anchor click handler.

   //Do stuff here

});

$("#anchor").click(function(e){

   //Do stuff here

   //This line stops the event bubling and 
   //jquery has abstracted it in the event object to make it cross browser compatible.
   e.stopPropagation();
});
person ShankarSangoli    schedule 04.08.2011

Также:

event.stopPropagation()

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

person Jason Kaczmarsky    schedule 04.08.2011

Да, событие идет вверх по дереву, и если какой-либо элемент имеет обработчик для этого события, он будет вызван. Добавив return:false в обработчик одного из элементов, событие не будет всплывать.

person Ionut Popa    schedule 04.08.2011

Эти две ссылки предоставляют четкое и подробное объяснение всплывающей подсказки событий (а также часто используемые концепции событий).

http://jqfundamentals.com/chapter/events
http://www.mattlunn.me.uk/blog/2012/05/what-does-event-bubbling-mean/

Из первой ссылки

событие будет запущено для элемента a, а также для всех элементов, содержащих a — вплоть до document

Со второй ссылки

<div>
    <h1>
        <a href="#">
            <span>Hello</span>
        </a>
    </h1>
</div>

Предположим, что мы щелкаем по диапазону, что вызывает запуск события щелчка по диапазону; пока ничего революционного. Однако затем событие распространяется (или всплывает) к родительскому элементу диапазона ( ), и для него запускается событие щелчка. Этот процесс повторяется для следующего родителя (или предка) вплоть до элемента документа.

Теперь давайте поместим все это в контекст DOM. DOM - это... дерево, и каждый элемент является узлом в дереве DOM. В этом случае пузырение - это просто обход узла, some element к корневому узлу, document (следуйте за своим родителем, пока не сможете больше)

person Gerald    schedule 24.06.2015