DOM 要素が削除されると、そのリスナーもメモリから削除されますか? 質問する

DOM 要素が削除されると、そのリスナーもメモリから削除されますか? 質問する

DOM 要素が削除されると、そのリスナーもメモリから削除されますか?

ベストアンサー1

最新のブラウザ

プレーンなJavaScript

削除された DOM 要素が参照フリー (その要素を指す参照がない) である場合は、はい、その要素自体と、それに関連付けられているイベント ハンドラー/リスナーがガベージ コレクターによって取得されます。

var a = document.createElement('div');
var b = document.createElement('p');
// Add event listeners to b etc...
a.appendChild(b);
a.removeChild(b);
b = null; 
// A reference to 'b' no longer exists 
// Therefore the element and any event listeners attached to it are removed.

ただし、その要素を指す参照がまだある場合、その要素とそのイベント リスナーはメモリ内に保持されます。

var a = document.createElement('div');
var b = document.createElement('p'); 
// Add event listeners to b etc...
a.appendChild(b);
a.removeChild(b); 
// A reference to 'b' still exists 
// Therefore the element and any associated event listeners are still retained.

jQuery

remove()jQuery の関連メソッド ( など) はまったく同じように機能すると想定するのが妥当でしょう(たとえば がremove()を使用して記述されていることを考慮すると)。removeChild()

しかし、これは真実ではありません。jQueryライブラリには実際には内部メソッド(文書化されておらず、理論上はいつでも変更される可能性があります)があります。cleanData() (この方法は次のようになります) は、DOM から要素が削除されると ( 、 などを介して)、その要素に関連付けられたすべてのデータ/イベントを自動的にクリーンアップremove()empty()ますhtml("")


古いブラウザ

古いブラウザ、特に IE の古いバージョンでは、イベント リスナーが関連付けられている要素への参照を保持し続けるため、メモリ リークの問題が発生することが知られています。

レガシーIEバージョンのメモリリークを修正するために使用される原因、パターン、および解決策の詳細な説明が必要な場合は、以下を読むことを強くお勧めします。Internet Explorer のリーク パターンの理解と解決に関する MSDN の記事。

これに関連する記事があといくつかあります:

この場合、リスナーを手動で削除することはおそらく良い習慣になるでしょう (メモリがアプリケーションにとって非常に重要であり、実際にそのようなブラウザをターゲットにしている場合のみ)。

おすすめ記事