2016-09-09 5 views
0

ダイナミックに作成されたHTMLタグに動的なclickHandlerを削除する必要がありますか、ガベージコレクタによって自動的に処理されるべきですか。動的要素からonClickを削除する

私の主なブラウザはSafari(iOSアプリに組み込まれています)ですが、IEのメモリリーク問題を抱えています。そう

var li = document.createElement('li'); 
li.addEventListener('click', function(){}); 

この要素は、後にDOMから削除された場合、私は念のためにと、clickHandlerを削除する必要があり、私はプロパティはclickHandlerを削除する方法を教えてください?

+0

要素がグローバル変数から参照されていないことを確認してください。そうでないと、ガベージになることはありません。 – Barmar

+0

親 'ul'のみが子の' appendChild'を参照し、子を一旦削除すると、 'clickHandler'はガベージコレクションされますか?グローバルからの参照はありません。 –

答えて

0
li.removeEventListener("click", function_name); 

これは、イベントリスナーを削除します

出典:匿名関数についてhttp://www.w3schools.com/jsref/met_element_removeeventlistener.asp

は、それらの点は全く言及がないように実際にあるとremoveEventListener()のためにあなたが必要となりますので、名前を欠い名前付き関数。

+0

リファレンスと機能がインラインで提供されていない場合は、私の例と同じですか? –

+0

ガベージコレクションについては、それについてはあまりよく分かりません。 –

+0

インライン関数をインライン関数にすることはできますが、インラインについてはわからない場合は、さらに調査を行います –

0

要素を削除した後に要素に参照が残っていない場合、GCは参照するハンドラ関数をクリーンアップする必要があります。だから何もする必要はありません。

しかし、IEはこの道に沿ってバグを持っている場合は、ハンドラを削除するremoveEventListenerを使用することができますが、あなたはaddEventListenerを呼び出したときに、あなたがやったとremoveEventListenerに同じ機能を提供する必要があるため、これは、あなたが名前の関数を使用する必要があります、無名関数は決して同じではありません。

function myClickHandler { 
    ... 
} 
var li = document.createElement('li'); 
li.addEventListener('click', myClickHandler); 
... 
li.removeEventListener('click', myClickHandler); 
myClickHandler = null; 
li.parentNode.removeChild(li); 

myClickHandler = null;それはGCedではありませんので、それ以外の場合は、関数名は、ハンドラ関数への参照を保持するために必要とされます。

複数のLIがあり、それらがすべて同じハンドラ関数を使用している場合は、これを行う必要はありません。どれくらいのLIを持っていても、それらはすべて同じ機能を指しているため、多くのメモリを占有しません。

+0

DOMからこの要素を単に削除すると、私の匿名関数ガベージが収集されますか? –

+0

はい、それを私の答えに加えました。 – Barmar

関連する問題