event.stopPropagation останавливает распространение живых событий, хотя это не должно - PullRequest
1 голос
/ 19 июля 2011

В документации сказано, что event.stopPropagation не должен останавливать распространение живых событий (http://api.jquery.com/event.stopPropagation). Однако для меня это работает как раз наоборот. Попробуйте это: http://jsfiddle.net/PSYg8. Нажатие на красный Div должно запустить событие live, прикрепленное к элементу html.

Ответы [ 3 ]

0 голосов
/ 19 июля 2011

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

Значение

$('html').live('click', function(e){
    e.stopPropagation(); // does nothing
    alert('html');
});

Вы неверно истолковали документацию. Когда вы останавливаете распространение по событию click, оно не переходит в живое событие.

0 голосов
/ 19 июля 2011

В документации говорится, что невозможно вызвать stopPropagation из обработчика live.

Поскольку jQuery реализует события live, прослушивая все события, которые распространяются до элемента <html>, а затем проверяет, соответствует ли элемент обжига вашему исходному селектору, остановка распространения из обычного обработчика события в элементе предотвращает событие от когда-либо достигать обработчик live.

Редактировать: Если вам непонятно, как работают события DOM и распространение событий, QuirksMode имеет прекрасный анализ моделей захвата и всплытия , а у Microsoft отличная страница, которая позволяет визуализировать, как работает распространение событий в моделях W3C, classic и IE.

0 голосов
/ 19 июля 2011

Вы меняете предметы. Внутри .live вы не можете использовать stopPropagation. Так, например, это генерирует два оповещения: http://jsfiddle.net/PSYg8/1/.

$(document).ready(function(){
    $('html').live('click', function(){
        alert('html');
        event.stopPropagation();
    });

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

Внутри .click (.bind), stopPropagation работает без проблем. Он просто останавливает всплывающее событие div до элемента html.

...