removeChild
関数は本当に子ノードを完全に削除しますか? それとも、指定された親ノードの子である要素を削除するだけですか? 要素が実際に削除されない場合、要素を完全に削除する方法はありますか?
4 に答える
このremoveChild
メソッドは、親からそれを削除するだけです。ページの表示要素である場合は、ページから削除されます。
しかし、Javascriptにはガベージコレクションがあります。これは、変数がノードオブジェクトを参照している限り、ノードオブジェクト自体が存在し続けることを意味します。したがって、ノードを変数に割り当て、removeChild
その親ノードからノードを「プルーニング」し、後でそれを他のノードに挿入または追加して、ページ上で効果的に移動することができます。
次のコードはノードを削除し、10秒待ってからツリー(つまりページ)に再度追加します。
var oldNode = someNode.removeChild(...);
setTimeout(function () {
document.documentElement.appendChild(oldNode);
}, 10000);
これは、ノードオブジェクトを指す変数(つまり、oldNode
)がまだあるため、ノードオブジェクトがメモリから削除されていないことを意味します。
別のケース:
var node = document.getElementById('test');
// ... do stuff
node.parentElement.removeChild(node);
// 'node' still exists, but has been removed from the page
// ... do some more stuff
node = document.getElementById('hello');
// The variable 'node' now points to something else;
// this means the original node will be deleted from memory
一方、削除されたノードを別の変数に再割り当てしないと、アクセスできなくなります(ドキュメントツリーから削除されたため、ドキュメントツリー経由ではなく、JS変数経由ではありません)。したがって、Javascriptは自動的にメモリから削除します。
someNode.removeChild(...);
削除されたノードを変数に割り当ててから、その変数にnull
(または他の何かを)割り当てること(Marc Bが彼の答えで示唆しているように)は完全に不要であり、私見ではばかげています。
これにより、ノードが完全に削除されます。
someNode.removeChild(...);
これによりノードが DOM から削除されて表示されなくなりますが、別の場所に挿入できるようにノードが保存されます。
oldNode = someNode.removeChild(...);
本当に dom 要素を削除したい場合。removeChild だけでは十分ではありません。これは、YSlow の作成者である Steve Sounders によるものです。削除を使用する必要があります
removeChild は要素を dom から削除しますが、削除を行って別の場所に再挿入する場合に備えて、関数からも返されます。削除されたノードを実際に取り除くには、その戻り値を強制終了する必要があります。
oldNode = someNode.removeChild(...);
oldNode = null;