程序员为什么说“现场”效率低下?
答案 0 :(得分:6)
我认为这是低效的,因为处理程序放在根节点上,并依赖冒泡来捕获事件并运行正确的处理程序。
另一种选择是在动态创建的元素创建并添加到DOM时简单bind
处理程序。
另一种方法是将单个处理程序绑定到容器,并让您的事件冒泡到那个。如果您将大量相同的元素添加到容器中,这可能会很好。
<div id="myContainer">
<div class="myElement>element</div>
<div class="myElement>element</div>
<div class="myElement>element</div>
<div class="myElement>element</div>
</div>
将点击处理程序绑定到#myContainer
而不是每个.myElement
。
$('#myContainer').click(function(e) {
$target = $(e.target);
if($target.closest('.myElement').length) {
// Run my code for the click
}
});
我认为这可能会遇到与.live()
相同的低效率,但应该更好,因为它更加本地化。添加了新的.myElement
项,自动生效。
修改强>
根据the docs:从jQuery 1.4开始,事件冒泡可以选择停在DOM元素“context”上。
这似乎会产生与我提到的最后一种方法类似的效果。
修改强>
根据Nick Craver的建议,jQuery的.delegate()
方法可以更干净地产生类似的效果。
示例由Nick提供:
$('#myContainer').delegate('.myElement', 'click' function() { alert($(this).text()); });
答案 1 :(得分:1)
live()
可能只会被视为低效:
如果您的用例符合上述标准(尤其是#2),您应该坚持直接绑定元素并避免使用live()
。
您可以尝试对live()
的性能进行基准测试的示例是通过分析使用live()
将click
处理程序绑定到元素的代码片段,并分析另一个片段使用click()
绑定到同一元素的代码。
我不太确定你会得到什么样的最终结果,但我相信它会很有趣。
答案 2 :(得分:1)
正如@patrick建议的那样,它可能效率低下,因为它需要处理文档中的所有事件,无论气泡是否到达您的元素。
这是delegate可以提供帮助的地方,因为它的工作方式与实时相同,但允许它仅通过将文档限制为公共父级来实现较小比例的文档
(使用他的例子)
$('#myContainer').delegate('div.myElement', 'click', function(){});