【问题标题】:Does remove a DOM object (in Javascript) will cause Memory leak if it has event attached?如果附加了事件,删除 DOM 对象(在 Javascript 中)是否会导致内存泄漏?
【发布时间】:2011-03-01 01:49:21
【问题描述】:

那么,如果在 javascript 中,我在 HTML 页面中创建一个 DOM 对象,并将事件监听器附加到 DOM 对象,当我从 HTML 页面中删除 DOM 时,事件监听器是否仍然存在并导致内存泄漏?

  function myTest() {
     var obj = document.createElement('div');
     obj.addEventListener('click', function() {alert('whatever'); });
     var body = document.getElementById('body'); // assume there is a <div id='body'></div> already
     body.appendChild(obj);
  }

  // then after some user actions. I call this:
  function emptyPage() {
    var body = document.getElementById('body');
    body.innerHTML = '';  //empty it.
  }

所以,body 中的 DOM 对象 &lt;div&gt; 消失了。但是eventlistener 呢? 我只是担心它会导致内存泄漏。

【问题讨论】:

    标签: javascript dom memory-leaks event-listener


    【解决方案1】:

    JavaScript 会自动为您进行垃圾收集。

    它可能会立即释放它,也可能会在最佳时机等待。这取决于 JavaScript 实现。

    所以不,它不会导致内存泄漏。

    【讨论】:

    • 因为我之前在动作脚本中遇到过内存泄漏问题。情况是当我从 DOM 树中删除 Flash 嵌入对象时,侦听器仍然存在。这就是为什么我担心什至从 HTML 中删除 DOM,监听器还活着......
    • 卢卡斯,你确定吗?我已经在很多地方搜索了一个确切的答案:是的,不,什么浏览器?我发现的只是矛盾。
    【解决方案2】:

    可悲的是,W3C 没有一个事件集合,您可以在其中筛选应用于单个元素的所有事件。您可以手动完成(即 obj.Events = {}; obj.Events[type] = []; obj.Events[type].push(fn) 为每个添加的事件。Event[types] 是一个数组,所以如果您希望一次触发多个函数,则可以单独删除每个函数),然后遍历 obj.Events 对象以在删除对象之前删除所有事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 2015-03-08
      • 1970-01-01
      相关资源
      最近更新 更多