2013-09-24 162 views
2

如果您还使用removeChild()删除元素,则会删除与项目关联的事件?即使该物品被简单的this.innerHTML =''删除?这同样适用于像这样的内联元素相关的事件<div onclick="/*this event*/"> </div>?提前致谢。删除元素是否也会删除其事件侦听器?

+0

我只是想知道,如果他们保持不变的记忆... – user2809046

+0

我认为这取决于从浏览器和它的垃圾收集器....但我不知道 –

+0

'removeChild之()' - 它删除元素内的所有信息,当然它删除它的'onclick'等 –

回答

4

我做了如下试验:

<div class="wrapper"> 
    <a href="#">Link</a> 
</div> 
<script type="text/javascript"> 
    window.onload = function() { 
     var wrapper = document.querySelector(".wrapper"); 
     var link = document.querySelector("a"); 
     link.addEventListener("click", function() { 
      console.log("click"); 
     }); 
     setTimeout(function() { 
      wrapper.innerHTML = ""; 
     }, 4000) 
    } 
</script> 

和监测开发工具的结果。加载页面后,附加事件从5变为6.链接从DOM中删除,事件侦听器再次变为5。

enter image description here

+0

因此,内联事件也可以通过innerHTML去除? – user2809046

+0

@ user2809046 [真的没有东西被删除](http://jsfiddle.net/Hm8GE/3/),如果你仍然有一个元素的引用,就像在Tibos的回答中所说的那样。如果没有参考,该元素及其成员将被删除。 – Teemu

+0

因此,你建议我手动删除事件?以及如何内联事件? – user2809046

7

答案是这取决于你是否有引用它。

var d = document.createElement('div'); 
otherElement.appendChild(d); 
otherElement.removeChild(d); 
// still have reference to d, it will exist, event listener remains even if it won't be fired. 

如果你不再有办法访问它,该元素将垃圾与听众(所有浏览器> IE6)一起收集。

+0

同样在IE <7中,如果在事件处理程序本身中没有对该元素的现有引用。即没有像'var elem = event.srcElement;'声明的变量'在移除具有此处理程序的元素时,IE <7'elem'会导致内存泄漏。 – Teemu