没有jQuery的stopPropagation

时间:2011-08-17 15:55:41

标签: javascript jquery stoppropagation

我绑定到一个链接(使用jQuery的.live()函数)click事件,然后手动添加一个带有纯JS和HTML的onclick事件处理程序(如{{1} })。我想防止事件冒泡到<a href="".... onclick="some action">方法,但我不知道如何。

也许live在这种情况下很有用,但添加了e.stopPropagation()的事件处理程序是用纯JS编写的,我无法从jQuery元素包装器外部调用onclickstopPropagation()在这种情况下不起作用。我尝试用return false替换return false,但我认为这是错误的,因为它不起作用。

如何在没有jQuery包装器的情况下防止冒充$.Event('click').stopPropagation()方法?

2 个答案:

答案 0 :(得分:14)

我假设“普通”事件处理程序中的return false也阻止事件冒泡,but I was wrong(感谢@Mrchief)。

还有其他方法可以阻止它,如quirksmode.org所述:

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

cancelBubble适用于IE,stopPropagation适用于所有兼容W3C的浏览器。

答案 1 :(得分:2)

使用.live,您无法阻止传播。这是因为使用.live,事件处理程序绑定到DOM树的根。因此,在调用处理程序之前,事件必须冒泡到最高元素。它是关于使用.live的注意事项之一。

考虑使用.delegate(如果您希望处理程序保留)或使用.bind代替。

如果要完全禁用实时处理程序,请使用die:

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

Demo 1: JsFiddle 1

或者,添加内联处理程序(并从那里取消事件):

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

Demo 2: JsFiddle 2

在任何jquery事件处理程序之前,将首先调用内联处理程序。