2013-09-24 156 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