なぜremoveChildには親ノードが必要なのでしょうか?
-
26-09-2019 - |
質問
答えた後 この質問 なぜだろうという疑問が残ります removeChild
親要素が必要です。結局のところ、単純にできるのは、
node.parentNode.removeChild(node);
親ノードは常に Javascript/DOM エンジンで直接利用できる必要があるため、削除するノードの親ノードを指定することは厳密には必要ありません。
もちろん原理は理解していますが、 removeChild
は DOM ノードのメソッドですが、なぜ次のようなものがないのでしょうか document.removeNode
存在しますか (パラメータとして任意のノードを受け入れるだけです)?
編集: より明確に言うと、質問は次のとおりです。削除する(一意の)ノードが既にあるのに、なぜJSエンジンに親ノードが必要なのでしょうか?
解決
シンプルなデザインが保たれていると思います。ノード 5月 孤立して存在しますが、より興味深いのは DOM ツリーです。と removeChild
, 、削除するノードは、メソッドが呼び出されたノードの子である必要があります。
すべての子のリストを取得し、それぞれを手動で比較することは、それほどコストのかかる操作ではありません。ただし、削除するノードをすべての子孫から検索するのは確かにコストがかかります。
編集:更新に応じて、ブラウザは単に DOM仕様, を定義します。 removeChild
メソッドオン Node
. 。スペックとしては、 私の意見では, 、明確であり、仮定がないものでなければなりません。に似ています 依存関係の注入 その観点から。DOM コア仕様は、ノード、要素などの構成要素を使用してツリーをモデル化します。次のような単独のメソッドを追加します。 removeNode
これらの構成要素のどこかで、メソッドがその環境に関する暗黙の知識を持っていること、つまり、メソッドがその環境についての暗黙の知識を持っていることを意味します。 may
何らかのノードの子である場合は、そこから削除する必要があります。
w3 のタスクは、ほとんどのことを可能にする非常に堅牢な API を作成することです。適切に記述されていれば、ネイティブ API を中心にいつでも記述できるため、糖衣構文について心配する必要はありません。
他のヒント
混乱の原因は、要素を削除するということが、要素を削除したり破壊したりするような意味だと考えているためかもしれません。
しかし実際には、その概念は、 除去 基本的には、子供とその親の関係を壊すことを意味します。それはただの別離です。
したがって、親ノードを持たない要素を削除しても意味がありません。そして、親と子の間のつながりを断ち切りたい場合は、両方への参照が必要になるのは当然です。
そうは言っても、親のことをまったく気にせずに、単に子を親から削除したい場合があるのは事実です。そのため、DOM レベル 4 では ChildNode
インターフェイスは、 remove
方法。
そのインターフェースは次のように実装されています DocumentType
, Element
そして CharacterData
, で使用できます。 ドキュメントタイプ, 要素 そして Text
, Comment
, 、 そして ProcessingInstruction
ノード.
仮定すると node
これらのいずれかです。使用できます
node.remove();
すでに親ノードがない場合は、何も起こりません。