2013-09-26 3 views
5

, если я добавить обработчик событий на любой элемент в JavaScript какJavascript обработчик события после удаления узла

var link = document.createElement("a"); 

document.body.appendChild(link); 


link.addEventListner("click",function(){ 

    alert("do something"); 

}); 

, а затем я удалить ссылку

link.parrentNode.removeChild(link); 

то, что о случае, я прикрепил к ссылка он также будет удален или останется в памяти (немного путается с тем, как событие хранится в памяти и как долго), или я должен сначала удалить обработчик событий, а затем удалить узел ссылки.

+0

Вы не присоединяете события, вы присоединяете слушателя к событию (отсюда и название метода). Слушатель существует только до тех пор, пока объект (элемент DOM), к которому он присоединен, существует. – RobG

ответ

1

В выражениях функции javascript (в привязке события вашего случая) выделяют объект и, следовательно, потребляют память. Вы должны удалить или обработать его должным образом. Проверьте эту ссылку, которая подробно объясняет управление памятью.

Js Memory Management

Проверить раздел Сбор мусора.

3

Почти все браузеры будут удалять обработчик событий из памяти при вызове сборщика мусора. Тем не менее, IE6 и ниже имеют известную ошибку, которая может привести к тому, что обработчик событий не будет собираться с мусором, что приведет к утечке памяти страницы.

Раньше считалось хорошей практикой очистки обработчиков событий перед удалением элемента (на самом деле библиотеки, такие как YUI и JQuery, имеют функции для этого). Но в эти дни я бы сказал, только беспокоиться об этом, если вы заботитесь о IE6.


Примечание: на случай, если вам интересно об ошибке. Это связано с тем, что сборщик мусора IE не мог обрабатывать циклические ссылки, если он связан с DOM (в более старых IE он не мог обрабатывать циклические ссылки, даже если он не включал DOM).

Так, например, если у вас есть такой код:

myDiv.onclick = function() { myDiv.style.backgroundColor = 'red' } 
//        ^
//        | 
//      circular reference 

затем IE6 и ниже не может освободить обработчик события. Но если ваш обработчик событий не содержит никаких обратных ссылок на объект DOM, он прикреплен к нему, тогда IE будет мусором собирать его.

+0

Ссылка на связанный с этим вопрос: http://stackoverflow.com/questions/10092619/precise-explanation-of-javascript-dom-circular-reference-issue – slebetman

+0

IE 6 и 7 не поддерживают * addEventListener * в любом случае, поэтому в в этом случае они просто выбросят ошибку. ;-) – RobG

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