没有jQuery的stopPropagation

abo*_*nec 12 javascript jquery stoppropagation

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

Fel*_*ing 14

我假设return false在"正常"事件处理程序中也阻止事件冒泡,但我错了(感谢@Mrchief).

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

function doSomething(e)
{
    if (!e) var e = window.event;
    e.cancelBubble = true;
    if (e.stopPropagation) e.stopPropagation();
}
Run Code Online (Sandbox Code Playgroud)

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

  • @Abonec:如果你有一个内联事件处理程序,那么事件对象可以通过变量`event`或`window.event`获得.例如`onclick ="event = event || window.event; event.cancelBubble = true; // etc ....".或者你定义了一个函数并调用`onclick ="something(event || window.event)"`. (2认同)

Mrc*_*ief 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
Run Code Online (Sandbox Code Playgroud)

演示 1:JsFiddle 1

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

<a href=".." onclick="yourhandler">
Run Code Online (Sandbox Code Playgroud)

演示 2:JsFiddle 2

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