StopPropagation без jQuery

Я привязываюсь к ссылке (используя функцию .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(), но я думаю, что это неправильно, поскольку это не сработало.

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

Ответ 1

С . 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

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

Ответ 2

Я был в предположении, что 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 браузерах.