我有一个产品列表,我需要动态更新#container
的InnerHTML。
我的问题是,如果我在这个答案中做类似的事情:jQuery删除元素内的所有事件处理程序
$("#container").find("*").off();
所以,我删除了所有孩子的所有活动处理程序,然后更新HTML:
$("#container").html(responseFromAJAX);
这将如何影响性能?我的意思是,这是删除所有旧元素和处理程序并清理记忆的好方法,还是我需要做更多?
我的应用程序是一个网络商店,因此我的用户会环顾四周,并更新#container
大概30-50次/访问。
事件处理程序,直接连接到DOM元素,当DOM元素从DOM删除时死亡。
更换内容就足够了。
委派事件作为更好的替代方案:
延期事件(事件委托)的规则不同,因为事件实际上并未连接到单个DOM元素,而是在较高级别捕获(例如document
)。然后运行选择器,事件函数与匹配元素运行。延期事件将较少的内存绑定在一起,但运行速度较小(您永远不会注意到鼠标事件的区别),因为仅在事件触发时进行元素搜索。
我通常建议使用递延的on
,而不是连接到许多单个元素,尤其是当您的DOM元素动态加载时。
,例如
$(document).on('someeventname', 'somejQueryselector', function(e){
// Handle the event here
});
带有授权处理程序的事件序列
- 将一个委派的处理程序附加到单个非变化祖先元素(如果没有其他任何其他原因,
document
是最好的默认值,因为几个原因是更接近/方便的)。有关详细信息,请参见注释。 - 选定的事件气泡到委派的目标元素
- 将jQuery选择器应用于气泡链中的元素
- 事件处理程序仅针对匹配元素。
的结果是,委派的处理程序仅在事件时匹配,因此可以动态添加/删除的内容应对。事件注册时的运行时开销实际上较低(因为它仅连接到一个元素),而在事件时间上的速度差可以忽略不计(除非您可以单击鼠标每秒50,000次!)。<<<<<<<<<<<<<</p>
注意:
- 有了委派事件,您应该尝试将它们附加到一个元素上,这是目标元素的祖先,并且不会更改。
- 后备通常是
body
或document
,如果没有其他方便的情况。 - 使用
body
进行委派事件可能会导致错误与样式有关。这可能意味着鼠标事件不会气体到身体(如果body
的计算高度为0)。document
更安全,因为它不受样式影响。 - 也存在
document
始终存在,因此您可以在dom-Ready处理程序之外附上委派的事件处理程序没有任何问题。
您可以像许多其他jQuery方法一样使用html(),它可以清理事件处理程序和关联的数据(当从元素从元素中删除时,不会自动清理btwdom)。
$("#container").html(responseFromAJAX);
来自文档:
.html()用于设置元素的内容,任何内容 在该元素中,新内容完全取代。 此外,jQuery删除了其他构造,例如数据和事件 处理程序在用儿童元素中替换这些元素之前 新内容。