2013-09-26 11 views
5

を除去した後のJavaScriptイベントハンドラ私はノード

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

document.body.appendChild(link); 


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

    alert("do something"); 

}); 

のようにJavaScriptで任意の要素にイベントハンドラを追加し、私は意志をリンクに接続そのイベントについて何、リンク

link.parrentNode.removeChild(link); 

を削除する場合それはまた削除されるか、それはメモリに残ります(ちょっとメモリとイベントの保存方法と混同します)。または、最初にイベントハンドラを削除してからリンクノードを削除する必要があります。

+0

イベントを添付しないで、イベントのリスナー(したがってメソッドの名前)を添付します。リスナーは、それがアタッチされているオブジェクト(DOM要素)が存在する限り存在します。 – RobG

答えて

1

JavaScriptでは、(あなたのケースのイベントバインディングで)関数式はオブジェクトを割り当てるため、メモリを消費します。あなたはそれを適切に取り除くか、扱うべきです。メモリ管理について詳しく説明しているこのリンクを確認してください。

Js Memory Management

ガベージコレクションのセクションを確認してください。

3

ガベージコレクタが呼び出されると、ほぼすべてのブラウザがメモリからイベントハンドラを削除します。しかし、IE6以下には既知のバグがあり、イベントハンドラがガベージコレクトされずにメモリリークが発生する可能性があります。

以前は、要素を削除する前にイベントハンドラをクリーンアップすることをお勧めしました(実際には、YUIやJQueryなどのライブラリにはこのための関数があります)。しかし、最近は、IE6について気にするだけで、これについて心配していると言いたい。


注:このバグについては疑問に思うかもしれません。これは、DOMに関係する場合、IEのガベージコレクタが循環参照を処理できないためです(古い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