这两个事件:
$(".top").bind("mouseover mouseout", function(e) {
});
$(".top").on("mouseover mouseout", ".sub", function(e) {
e.stopPropagation();
});
附在.top
. 但第二个是委托事件,jQuery 模拟它就像它是一个普通事件一样。如果您删除stopPropagation
:
$(".top").bind("mouseover mouseout", function(e) {
});
$(".top").on("mouseover mouseout", ".sub", function(e) {
});
您会注意到第二个事件首先被触发,就好像它直接附加到.sub
. jQuery 模拟委托事件的传播,就好像它是一个普通事件一样。
因此很明显,如果子元素停止传播,则父元素将不会收到该事件。但正如我提到的,它只是 jQuery 中的一个仿真。
更新
尽管 jQuery 官方网站在http://api.jquery.com/on/上对它进行了很好的解释,但我将尝试on
简要解释方法。
on
方法是在 jQuery 1.7 中引入的。它被认为可以替代之前用于绑定事件的几种方法bind
:delegate
和live
. 最后两个用于附加委托事件。现在您可以使用一种方法附加它们on
。
常规活动:
$(".top").on("mouseover mouseout", function(e) {
});
完全一样
$(".top").bind("mouseover mouseout", function(e) {
});
委托活动:
$(".top").on("mouseover mouseout", ".sub", function(e) {
});
是相同的
$(".top").delegate(".sub", "mouseover mouseout", function(e) {
});
委托事件有什么用?
如果您的 html 是动态更改的。例如,您有一个<table>
并且您在表行上绑定了一些事件:
$("table tr").on("click", function(e) {
});
此事件不会在动态插入的行上触发。一种解决方法是使用委托事件:
$("table").on("click", "tr", function(e) {
});
该事件附加到表而不是行。所以它可以处理以后插入的任何行。
如果你有大量类似的元素。在这种情况下,如果您直接在元素上绑定事件,它可能会降低您的应用程序的速度。至少在 IE 中:) 所以使用委托事件可能会显着提高性能。您可以从第 1 点开始查看示例。
委托事件如何工作?
让我们举个例子<table>
:
$("table").on("click", "tr", function(e) {
});
我们将事件附加在桌子上,但要求它检查事件是否在tr
.
上面示例的粗略实现可能如下所示:
$("table").on("click", function(e) {
var tr = $(e.target).parentsUntil(this, 'tr');
if (tr.length){
//the event was triggered on tr inside table
//do some stuff
}
});