12

我绑定到一个链接(通过使用.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 包装器的情况下冒泡到方法?

4

2 回答 2

15

我假设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 兼容的浏览器。

于 2011-08-17T16:14:35.710 回答
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

演示 1:JsFiddle 1

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

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

演示 2:JsFiddle 2

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

于 2011-08-17T15:59:36.087 回答