2010-08-06 16 views
13

Después de responder this question Me pregunto por qué removeChild necesita un elemento padre. Después de todo, podríamos simplemente hacemos¿Por qué removeChild necesita un nodo principal?

node.parentNode.removeChild(node); 

Como el nodo padre debe estar siempre disponible directamente en el motor Javascript/DOM, no es estrictamente necesario para abastecer el nodo padre del nodo que se va a quitar.

Por supuesto que entiendo el principio de que removeChild es un método de un nodo DOM, pero ¿por qué no existe algo como document.removeNode (que simplemente acepta un nodo arbitrario como parámetro)?

EDIT: Para ser más claro, la pregunta es: ¿por qué el motor JS necesita el nodo padre en absoluto, si ya tiene el nodo (único) que se va a eliminar?

+1

El DOM es un concepto orientado a objetos. Eso significa que tendría más sentido si 'Node.prototype.remove' existiría para eliminar el nodo en sí mismo que si' Document.prototype.removeNode' existiera para eliminar un nodo del documento. Porque esto último simplemente se implementaría llamando a 'removeChild' en el padre del nodo. – Gumbo

Respuesta

7

Creo que mantiene el diseño simple. Un nodo puede existir de forma aislada, pero el caso más interesante es el árbol DOM. Con removeChild, el nodo que se va a eliminar debe ser hijo del nodo al que se llamó el método.

Obtener una lista de todos los niños y hacer una comparación manual entre ellos no es una operación tan costosa. Sin embargo, buscar todos los descendientes para un nodo que se va a eliminar es realmente costoso.

Editar: En respuesta a su actualización, un navegador es simplemente implementando el DOM spec, que define un método removeChild en Node. La especificación, en mi opinión, tiene que ser inequívoca y libre de suposiciones. Es similar al Dependency Injection desde esa perspectiva. La especificación DOM Core modela un árbol usando bloques de construcción como Nodo, Elemento, etc. Agregar un método solitario como removeNode en algún lugar de estos bloques de construcción significa que el método tiene conocimiento implícito sobre su entorno - que may es hijo de algún nodo, y debería eliminarse de allí si lo es.

La tarea de w3 es hacer una API muy robusta que hace que la mayoría de las cosas sean posibles. No deberían preocuparse por el azúcar sintáctico, ya que siempre se puede escribir en torno a las API nativas si están bien escritas.

+0

+1 Esa es una explicación mejor/correcta, creo. – Sarfraz

+0

Solo una nota más: Diego Perini [dijo] (http://twitter.com/diegoperini/status/20580063920) que IE y Opera actualmente soportan un ['removeNode'] (http://msdn.microsoft.com/ en-us/library/ms536708% 28VS.85% 29.aspx) método. –

1

La confusión puede deberse a que podría pensar que eliminar un elemento significa algo así como matarlo o destruirlo.

enter image description here

Pero, en realidad, el concepto de removal básicamente significa romper la relación entre un niño y su padre. Es solo un desapego.

enter image description here

Por lo tanto, la eliminación de un elemento que no tiene nodo padre no tiene sentido. Y es razonable que, si quiere romper esa conexión entre un padre y un hijo, necesita una referencia a ambos.

Dicho esto, es cierto que a veces lo único que desea es eliminar a un hijo de su padre, sin importarle nada a ese padre. Es por eso que DOM Level 4 introduce la interfaz ChildNode, que proporciona el método remove.

Esa interfaz se implementa mediante DocumentType, Element y CharacterData, para que pueda usarlo en doctypes, elements y Text, Comment y ProcessingInstructionnodes.

Suponiendo node es uno de estos, se puede utilizar

node.remove(); 

En caso de que ya no tiene nodo padre, no pasa nada.

Cuestiones relacionadas