2013-09-24 3 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/), если у вас все еще есть ссылка на элемент, как сказано в ответе Тибоса. Если нет ссылки, элемент и его члены будут исключены. – 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

Смежные вопросы