jQuery-为什么是;“生活”;效率低下?我们如何衡量这一点?
为什么程序员说“活”是低效的jQuery-为什么是;“生活”;效率低下?我们如何衡量这一点?,jquery,live,Jquery,Live,为什么程序员说“活”是低效的 那么,还有什么选择呢 复制该函数的方法 那会更有效吗 我们如何衡量它使事情减速的程度的影响 我认为这是低效的,因为处理程序放在根节点上,并且依赖冒泡来捕获事件并运行适当的处理程序 一种替代方法是在动态创建的元素被创建并添加到DOM中时,简单地将处理程序绑定到动态创建的元素 另一种选择是将单个处理程序绑定到一个容器,并让您的事件达到这个目的。如果您将许多相同的元素添加到容器中,这会很好 <div id="myContainer"> <div
我认为这是低效的,因为处理程序放在根节点上,并且依赖冒泡来捕获事件并运行适当的处理程序 一种替代方法是在动态创建的元素被创建并添加到DOM中时,简单地将处理程序绑定到动态创建的元素 另一种选择是将单个处理程序绑定到一个容器,并让您的事件达到这个目的。如果您将许多相同的元素添加到容器中,这会很好
<div id="myContainer">
<div class="myElement>element</div>
<div class="myElement>element</div>
<div class="myElement>element</div>
<div class="myElement>element</div>
</div>
我认为这可能与.live()
一样存在一些效率低下的问题,但应该更好,因为它更本地化。新增.myElement
项,自动生效
编辑: 根据:从jQuery1.4开始,事件冒泡可以选择在DOM元素“context”处停止 这似乎会产生与我提到的上一种方法类似的效果
编辑: 正如Nick Craver所建议的,jQuery的
.delegate()
方法可以更干净地产生类似的效果
尼克提供的示例:
live()
只有在以下情况下才会被视为低效:
live()
您可以尝试对live()
的性能进行基准测试的一个示例是,分析一段代码,该代码使用live()
将单击
处理程序绑定到一个元素,并分析另一段代码,该代码使用单击()
绑定到同一元素
我不太确定你会得到什么样的最终结果,但我相信这会很有趣。正如@patrick所建议的,它可能效率低下,因为它需要处理文档上的所有事件,无论气泡是否到达元素 这是可以帮助的地方,因为它的工作方式与live相同,但通过将文档限制在一个公共父级,它只能影响文档的一小部分 (以他的例子)
哪些程序员?关于什么“活”的事情?什么样的复制方法?我要在这里提到
.delegate()
,一种更简洁的方法来完成第二个示例:)@Nick Craver-不是.delegate()
将处理程序绑定到每个元素吗?我提到的方法的一个优点是,在多个元素上没有处理程序的开销。+1如果您给出一个示例:)您当前的标记将使用以下内容:$('#myContainer').delegate('.myElement','click'function(){alert($(this.text());})
@patrick-它使用上下文绑定处理程序,就像.live()
(实际上.delegate()
在内部调用.live()
)一样,而不是在文档
上侦听气泡,它侦听绑定到的元素,因此这是相同的行为,只是更早地抓住气泡而已。@Nick Craver-非常感谢。也只是看了一下文档,我误解了.delegate()
。谢谢你的提示。我包括了你的解决方案。
$('#myContainer').click(function(e) {
$target = $(e.target);
if($target.closest('.myElement').length) {
// Run my code for the click
}
});
$('#myContainer').delegate('.myElement', 'click' function() { alert($(this).text()); });
$('#myContainer').delegate('div.myElement', 'click', function(){});