[英]jQuery: what correct use of .on() in this situation?
考虑以下标记:
<div class="parent">
<div class="child">
button
</div>
</div>
我需要在child
类的click
事件上运行一个函数,并且有以下两个选项:
$(".parent").on("click", ".child", function(){....});
和
$(document).on("click", ".child", function(){....});
使用直接parent
对象作为目标与document
本身之间在性能上有显着差异吗? 对我来说,使用document
似乎是一个更可靠的选择(例如,如果更改了父类)-仅需确保如果我开始在各处使用此方法,就不会引起问题。
PS child
被动态添加到parent
内部,因此我正在使用.on()
$(".parent").on("click", ".child", function(){....});
将您的click事件仅绑定到文档中存在的类“ .parent”的元素,并且该事件从target('。child')冒泡到附加了处理程序的元素。 这比将其添加到文档中,将其添加到文档中这样更可取
$(document).on("click", ".child", function(){....});
使单击事件从文档中的目标起泡,一直发生到正文和文档元素。
如@Woff所述,绑定处理程序不会在删除.parent元素时被删除。
在您的情况下,“性能”应该不是问题。
您的两个选择之间有明显的区别:
<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
。
要考虑的其他要点:
恕我直言,最好是尽可能缩小您的行动范围。 从您的问题来看, $('.parent')
似乎是最好的目标。
但是,如果.parent
元素也被动态添加/删除,请不要将它们用作绑定目标。 尝试以您创建的其他节点为目标,但这些节点将始终保留在DOM中(例如:将html包裹在#myModule
div中,并将事件绑定到$('#myModule')
)。
.stopPropagation()
:委托与直接绑定的主要区别在于,当事件冒泡到目标节点时,将执行处理程序。
如果您依靠.stopPropagation()
或return false
来阻止其他处理程序的执行,则这会影响事件实际停止的时间。
这是一个小提琴来说明这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.