Por que o removeChild precisa de um nó pai?
-
26-09-2019 - |
Pergunta
Depois de responder essa questão Fico me perguntando por que removeChild
precisa de um elemento pai. Afinal, poderíamos simplesmente fazer
node.parentNode.removeChild(node);
Como o nó pai deve estar sempre disponível diretamente para o mecanismo JavaScript/DOM, não é estritamente necessário fornecer o nó pai do nó que deve ser removido.
Claro que entendo o princípio que removeChild
é um método de um nó DOM, mas por que não é algo como document.removeNode
existe (que apenas aceita um nó arbitrário como parâmetro)?
EDITAR: Para ser mais claro, a pergunta é: por que o mecanismo JS precisa do nó pai, se já possui o nó (único) que será removido?
Solução
Eu acho que isso mantém o design simples. Um nó poderia Existe isoladamente, mas o caso mais interessante é a árvore dom. Com removeChild
, o nó a ser removido deve ser um filho do nó no qual o método foi chamado.
Obter uma lista de todas as crianças e fazer uma comparação manual contra cada uma não é uma operação tão cara. No entanto, pesquisar todos os descendentes por um nó a ser removido é realmente caro.
Editar: Em resposta à sua atualização, um navegador está simplesmente implementando o DOM Spec, que define um removeChild
método em Node
. A especificação, Na minha opinião, tem que ser inequívoco e livre de suposições. É similar à Injeção de dependência a partir dessa perspectiva. O DOM Core Special modela uma árvore usando blocos de construção, como nó, elemento, etc. Adicionando um método solitário como removeNode
Em algum lugar desses blocos de construção significa que o método tem conhecimento implícito sobre seu ambiente - que may
Seja um filho de algum nó e deve ser removido a partir daí, se for.
A tarefa do W3 é criar uma API muito robusta, o que torna a maioria das coisas possíveis. Eles não devem se preocupar com o açúcar sintático, pois isso sempre pode ser escrito em torno das APIs nativas se estiverem bem escritas.
Outras dicas
A confusão pode ser porque você pode pensar que remover um elemento significa algo como matá -lo ou destruí -lo.
Mas, de fato, o conceito de remoção Basicamente, significa quebrar o relacionamento entre uma criança e seus pais. É apenas um desapego.
Portanto, remover um elemento que não possui nó pai não faz sentido. E é razoável que, se você quiser quebrar essa conexão entre um pai e um filho, precisará de uma referência a ambos.
Dito isto, é verdade que às vezes você só quer remover um filho de seus pais, sem se preocupar com esse pai. É por isso que o DOM Nível 4 apresenta o ChildNode
interface, que fornece o remove
método.
Essa interface é implementada por DocumentType
, Element
e CharacterData
, então você pode usá -lo em Doctypes, elementos e Text
, Comment
, e ProcessingInstruction
nós.
Assumindo node
é um deles, você pode usar
node.remove();
Caso ele já não tenha um nó pai, nada acontece.