考虑以下标记:
<div class="parent">
<div class="child">
button
</div>
</div>
我需要在click
类的child
事件上运行一个函数,我有以下两个选项:
$(".parent").on("click", ".child", function(){....});
和
$(document).on("click", ".child", function(){....});
使用直接parent
作为目标与document
本身之间的效果是否存在显着差异?使用document
对我来说似乎是一个更健壮的选项(例如,如果更改了父类) - 如果我开始在所有地方开始使用此方法,只需要确保它不会导致问题。
P.S。 child
在parent
内动态添加,因此我正在使用.on()
答案 0 :(得分:4)
$(".parent").on("click", ".child", function(){....});
将click事件绑定到文档中存在的类“.parent”的元素,并将事件从目标('。child')冒泡到附加处理程序的元素。这比将其添加到文档更好,因为将其添加到文档中
$(document).on("click", ".child", function(){....});
将来自文档中目标的点击事件一直冒泡到身体和文档元素。
正如@Woff所提到的,绑定处理程序在删除.parent元素时不会被删除。
答案 1 :(得分:0)
“性能”不应该是您的问题。
您的两个选择之间存在明显差异:
<div class="parent">
<div class="child" id="A">
button
</div>
</div>
<div class="child" id="B">
button
</div>
如果您在document
上绑定处理程序,则点击#B
将触发处理程序
如果您在.parent
上绑定处理程序,则单击#B
将不会触发处理程序。
您必须决定是否要监听文档中标有.child
类的所有节点,或仅监听嵌套在.parent
元素下的节点。
要考虑的其他要点:
恕我直言,最好尽量缩小你的行动范围。从您的问题来看,$('.parent')
似乎是最佳目标。
但是,如果还动态添加/删除了.parent
个元素,请不要将它们用作绑定目标。尝试定位您已创建的其他节点,但这些节点将始终保留在DOM中(例如:将您的html包装在#myModule
div中并将您的事件绑定到$('#myModule')
)。
.stopPropagation()
:委托与直接绑定的主要区别在于,当事件冒泡到目标节点时执行处理程序。
如果您依靠.stopPropagation()
或return false
来阻止执行其他处理程序,则会对事件实际停止的时间产生影响。
这是一个fiddle来说明这一点。