用活动处理程序删除元素



我有一个产品列表,我需要动态更新#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>

注意:

  • 有了委派事件,您应该尝试将它们附加到一个元素上,这是目标元素的祖先,并且不会更改。
  • 后备通常是bodydocument,如果没有其他方便的情况。
  • 使用body进行委派事件可能会导致错误与样式有关。这可能意味着鼠标事件不会气体到身体(如果body的计算高度为0)。document更安全,因为它不受样式影响。
  • 也存在 document 始终存在,因此您可以在dom-Ready处理程序之外附上委派的事件处理程序没有任何问题。

您可以像许多其他jQuery方法一样使用html(),它可以清理事件处理程序和关联的数据(当从元素从元素中删除时,不会自动清理btwdom)。

$("#container").html(responseFromAJAX);

来自文档:

.html()用于设置元素的内容,任何内容 在该元素中,新内容完全取代。 此外,jQuery删除了其他构造,例如数据和事件 处理程序在用儿童元素中替换这些元素之前 新内容。

相关内容

  • 没有找到相关文章

最新更新