当前位置: 首页 > 面试题库 >

如果删除了DOM元素,是否还将其侦听器也从内存中删除了?

方和豫
2023-03-14
问题内容

如果删除了DOM元素,它的侦听器也会从内存中删除吗?


问题答案:

现代浏览器

纯JavaScript

如果删除的DOM元素是无引用的(没有指向它的引用),则是垃圾收集器以及与之关联的任何事件处理程序/侦听器都会拾取该元素本身。

var a = document.createElement('div');
var b = document.createElement('p');
// Add event listeners to b etc...
a.appendChild(b);
a.removeChild(b);
b = null; 
// A reference to 'b' no longer exists 
// Therefore the element and any event listeners attached to it are removed.

然而; 如果仍然有引用指向该元素,则该元素及其事件侦听器将保留在内存中。

var a = document.createElement('div');
var b = document.createElement('p'); 
// Add event listeners to b etc...
a.appendChild(b);
a.removeChild(b); 
// A reference to 'b' still exists 
// Therefore the element and any associated event listeners are still retained.

jQuery

假设jQuery中的相关方法(例如remove())将以完全相同的方式起作用(考虑remove()是使用removeChild()示例编写的),这是公平的。

但是, 这不是真的 ;jQuery库实际上有一个内部方法(该方法未公开,理论上可以随时更改),称为cleanData()此方法看起来像这样,该方法会在从DOM中删除后自动清除与元素关联的所有数据/事件(通过是这样。remove()empty()html("")等等)。

较旧的浏览器

已知较旧的浏览器(尤其是IE的较旧版本)会出现内存泄漏问题,这是因为事件侦听器保留了对其所附加元素的引用。



 类似资料:
  • 问题内容: 我有一个按钮,并添加了一些按钮: 我可以通过以下方式删除它们: 如果我想一次删除所有侦听器,或者没有函数引用()怎么办?有没有办法做到这一点,或者我必须一个一个地删除它们? 问题答案: 我认为最快的方法是克隆节点,这将删除所有事件侦听器: 请注意,因为这也会清除所涉及节点的所有子元素上的事件侦听器,因此,如果要保留该侦听器,则必须一次显式删除一个侦听器。

  • 我使用使用捕获的计数器从容器中删除一半元素,如下所示。用编译的C 20 输出出乎意料。对于向量,删除了一个额外的元素: 我打印出结果,看起来是意外删除的元素 虽然这通常不是erase_if的正常用法,但我仍然很好奇为什么它只发生在向量上,而不发生在其他贴图上。我猜这和迭代器类型shenanigan有关。如果有人能详细解释,我将不胜感激。

  • 问题内容: 想象一下,我有以下类似的东西修改 如何在不影响任何子元素的情况下从DOM中仅删除(仅文本)“第一”,“第二”和“第三”。 问题答案: 如果要删除所有子文本节点,则可以使用,然后将匹配集减少为仅文本节点: 注意 :这将保留子元素上所有现有的事件处理程序,使用答案不会做(因为从DOM中删除了这些元素并重新添加了这些元素)。 注2 :一些链接的问题中的答案显示的代码与我的答案中的代码相似,但

  • 我知道你们中的一些人会对这个问题感到畏缩,因为我知道我所问的并不是最佳实践。然而,我无论如何都会问,希望把虐待减到最低。 当条件语句为假时,ngIf从DOM中删除元素。是否有设置、标志、参数等。这将改变ngIf的行为,使元素留在DOM中并被设置为显示:none?我不是在寻找一种变通方法,比如[hidden],但是我想知道是否有可能改变*ngIf的行为。 我很快(这是关键字)更新了一个现有的jQue

  • 我发现它更简洁一些,但我也发现lambda太笨拙了。 有什么建议如何以不那么笨拙的方式达到同样的结果?

  • 问题内容: 比方说: 对此: 我一直在寻找使用Mootools,jQuery甚至是(原始)JavaScript的方法,但是却不知道该怎么做。 问题答案: 使用jQuery,您可以执行以下操作: 快速链接到文档: 内容(): jQuery replaceWith( 内容 :[ 字符串 | 元素 | jQuery ]): jQuery