11

removeChild関数は本当に子ノードを完全に削除しますか? それとも、指定された親ノードの子である要素を削除するだけですか? 要素が実際に削除されない場合、要素を完全に削除する方法はありますか?

4

4 に答える 4

18

この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が彼の答えで示唆しているように)は完全に不要であり、私見ではばかげています。

于 2011-03-04T15:04:58.353 に答える
11

これにより、ノードが完全に削除されます。

someNode.removeChild(...);

これによりノードが DOM から削除されて表示されなくなりますが、別の場所に挿入できるようにノードが保存されます。

oldNode = someNode.removeChild(...);
于 2011-03-04T14:32:00.450 に答える
1

本当に dom 要素を削除したい場合。removeChild だけでは十分ではありません。これは、YSlow の作成者である Steve Sounders によるものです。削除を使用する必要があります

于 2011-11-09T05:31:17.957 に答える
1

removeChild は要素を dom から削除しますが、削除を行って別の場所に再挿入する場合に備えて、関数からも返されます。削除されたノードを実際に取り除くには、その戻り値を強制終了する必要があります。

oldNode = someNode.removeChild(...);
oldNode = null;
于 2011-03-04T14:22:22.997 に答える