stopPropagation без jQuery - PullRequest
       8

stopPropagation без jQuery

11 голосов
/ 17 августа 2011

Я связываюсь со ссылкой (используя функцию .live() jQuery) click, а затем вручную добавляю обработчик события onclick с чистым JS и HTML (например, <a href="".... onclick="some action">).Я хочу предотвратить возникновение события в методе live, но не знаю как.

Может быть, e.stopPropagation() полезен в этой ситуации, но обработчик событий, добавленный с onclick, написан на чистом JS, и я не могу вызвать stopPropagation() извне обертки элемента jQuery.return false в этой ситуации не работает.Я пытался заменить return false на $.Event('click').stopPropagation(), но я думаю, что это неправильно, поскольку он не работал.

Как предотвратить переход к методу live() без оболочки jQuery?

Ответы [ 2 ]

14 голосов
/ 17 августа 2011

Я предполагал, что return false в «обычных» обработчиках событий также предотвращает всплытие события, , но я ошибся (спасибо @ Mrchief ).

Есть и другие способы остановить его, как описано на quirksmode.org :

function doSomething(e)
{
    if (!e) var e = window.event;
    e.cancelBubble = true;
    if (e.stopPropagation) e.stopPropagation();
}

cancelBubble для IE, stopPropagation работает во всехW3C-совместимые браузеры.

2 голосов
/ 17 августа 2011

С .live вы не можете остановить распространение. Это связано с тем, что при .live обработчик событий привязан к корню дерева DOM. Следовательно, событие должно всплыть до самого высокого элемента, прежде чем ваш обработчик может быть вызван. Это одно из предостережений при использовании .live.

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

Если вы хотите, чтобы живой обработчик был полностью отключен, используйте die:

$("#myHref").die("click", aClick); // this will remove any existing event handlers
$("#myHref").click(yourhandler);   // add your handler

Демонстрация 1: JsFiddle 1

Или добавьте встроенный обработчик (и отмените событие оттуда):

<a href=".." onclick="yourhandler">

Демонстрация 2: JsFiddle 2

Встроенные обработчики будут вызываться первыми всегда перед любыми обработчиками событий jquery.

...