2011-12-27 37 views
1

the jQuery docs不应该返回false阻止jQuery on()冒泡?

从事件处理程序返回false将自动调用 event.stopPropagation()和event.preventDefault()。一个虚假的值可以 也作为function(){return false; }。因此,$(“a.disabled”)。on(“click”,false);将事件 处理程序附加到具有“已禁用”类的所有链接,以防止它们在单击时被跟踪,并且还会从 冒泡停止该事件。

所以,当我创建一个click事件:

$('#sidebar').on("click", ".toggle", function() { 
    $(this).parents("p").next("ul").toggle(400); 
    return false; 
}); 

我会希望用户点击未注册,因为它不会有机会从.toggle传播到#sidebar

唯一的解释我如果允许这种情况发生,它会使on()函数毫无意义,所以在这种情况下可能会被绕过?

on()遵循什么规则冒泡?

回答

3

实际上,处理程序连接到元素#sidebar而不是.toggle元素。

所以当你点击一个内部元素时,事件会冒泡直到达到`#sidebar',然后只执行处理程序。如果在处理程序中返回false,则会进一步停止传播。


.on()的文档通过一个例子提到了这一点:

除了他们来处理后代元素事件的能力 尚未创建,委派事件的另一个优点是其非常重要的 潜力当许多元素必须被监控时,开销较低。在具有在其TBODY 1000行的数据表,这个例子 附加一个处理程序,以1,000个元素:

$("#dataTable tbody tr").on("click", function(event){ 
    alert($(this).text()); 
}); 

委派的事件的方法附着的事件处理程序仅一个元件,所述TBODY,和该事件只需要泡了一个级别(从点击的TR到TBODY):

​​
+0

,我读了一部分翻了几十倍,并没有作出与回报虚假的连接。现在有道理。谢谢 – 2011-12-27 20:15:30

1

您示例中的click事件附加到#sidebar,并且如果您从处理程序返回false,则它不会在DOM树上继续传播。

下面是一个例子小提琴:http://jsfiddle.net/QymkW/

这其中的原因在语法事件代表团最近的变化之一,使用.live()语法,人们可能会认为该事件是连接到你通过元素在链中,但它始终是document。这在传播方面令人困惑。

使用.on()语法,您现在可以更清楚地了解到底发生了什么。该事件附加到传递的元素,然后如果要从后代委托事件,则可以添加第二个参数。因此,传播“必须”的委托后裔和代表团工作元素之间发生,但你仍然可以防止附着事件的元素冒泡(在你的情况#sidebar

3

为了on()工作,点击事件必须冒泡到呼叫元素,在这种情况下#sidebaron()然后查看点击的目标以确定它是否为.toggle并相应地触发该功能。

可以传递事件到您的处理器,添加

event.stopImmediatePropagation()

,以防止其它装订处理器烧制而成。