13

この質問に答えた後、なぜremoveChild親要素が必要なのか疑問に思っています。結局のところ、私たちは簡単にできる

node.parentNode.removeChild(node);

親ノードは Javascript/DOM エンジンで常に直接使用できる必要があるため、削除するノードの親ノードを指定する必要は厳密にはありません。

もちろんremoveChild、DOMノードのメソッドである原理は理解していますが、なぜそのようなものdocument.removeNode(任意のノードをパラメータとして受け入れるだけのもの)が存在しないのですか?

編集:より明確にするために、質問は:削除する(一意の)ノードが既にある場合、JSエンジンが親ノードを必要とするのはなぜですか?

4

2 に答える 2

7

シンプルなデザインに仕​​上がっていると思います。ノード単独で存在する場合もありますが、より興味深いケースは DOM ツリーです。ではremoveChild、削除するノードは、メソッドが呼び出されたノードの子である必要があります。

すべての子のリストを取得し、それぞれを手動で比較することは、それほど高価な操作ではありません。ただし、削除するノードのすべての子孫を検索すると、実際にコストがかかります。

編集:更新に応じて、ブラウザはDOM 仕様removeChildを実装しているだけであり、これは のメソッドを定義していNodeます。私の意見では、仕様は明確で仮定のないものでなければなりません。その観点からは、依存性注入に似ています。DOM Core 仕様は、Node、Element などのビルディング ブロックを使用してツリーをモデル化します。removeNodeこれらのビルディング ブロックのどこかに単独のメソッドを追加することは、メソッドがその環境に関する暗黙の知識を持っていることを意味しmayます。ある場合はそこから削除する必要があります。

w3 のタスクは、ほとんどのことを可能にする非常に堅牢な API を作成することです。適切に記述されていれば、ネイティブ API の周りにいつでも記述できるため、シンタックス シュガーについて心配する必要はありません。

于 2010-08-06T09:26:06.830 に答える
1

要素を削除するということは、要素を殺す、または破壊するようなことを意味すると考えるかもしれません。

ここに画像の説明を入力

しかし、実際には、削除の概念は基本的に、子とその親の間の関係を壊すことを意味します。それは単なる分離です。

ここに画像の説明を入力

したがって、親ノードを持たない要素を削除しても意味がありません。そして、親と子の間のその接続を断ち切りたい場合は、両方への参照が必要であることは合理的です。

とはいえ、親のことをまったく気にせずに、親から子を削除したい場合があることは事実です。そのため、DOM レベル 4では、メソッドChildNodeを提供するインターフェースが導入されていますremove

そのインターフェースはDocumentTypeElementおよびによって実装されているため、 doctypes要素、およびノー​​ドでCharacterData使用できます。TextCommentProcessingInstruction

これらのいずれかであると仮定するとnode、使用できます

node.remove();

すでに親ノードがない場合は、何も起こりません。

于 2016-03-15T00:22:25.043 に答える