parentnode parentelement ejemplos child javascript firefox dom

javascript - ejemplos - Diferencia entre DOM parentNode y parentElement



parents javascript (5)

¿Puede alguien explicarme en términos tan simples como sea posible, cuál es la diferencia entre el parentNode DOM parentNode y el nuevo elemento introducido en Firefox 9 parentElement


Al igual que con nextSibling y nextElementSibling , recuerde que las propiedades con "elemento" en su nombre siempre devuelven Element o null . Las propiedades sin pueden devolver cualquier otro tipo de nodo.

console.log(document.body.parentNode, "is body''s parent node"); // returns <html> console.log(document.body.parentElement, "is body''s parent element"); // returns <html> var html = document.body.parentElement; console.log(html.parentNode, "is html''s parent node"); // returns document console.log(html.parentElement, "is html''s parent element"); // returns null


En Internet Explorer, parentElement no está definido para los elementos SVG, mientras que parentNode está definido.


Use .parentElement y no podrá equivocarse siempre y cuando no use fragmentos de documentos.

Si usa fragmentos de documentos, entonces necesita .parentNode :

let div = document.createDocumentFragment().appendChild(document.createElement(''div'')); div.parentElement // null div.parentNode // document fragment

También:

let div = document.getElementById(''t'').content.firstChild div.parentElement // null div.parentNode // document fragment

<template id=t><div></div></template>

Aparentemente, el .parentNode <html> enlaza al Document . Esto se debe considerar un fallo de decisión, ya que los documentos no son nodos, ya que los nodos se definen como documentos que pueden contener los documentos y los documentos no pueden contenerlos.


parentElement es nuevo para Firefox 9 y para DOM4, pero ha estado presente en todos los demás navegadores importantes durante años.

En la mayoría de los casos, es lo mismo que parentNode . La única diferencia viene cuando el nodo parentNode un nodo no es un elemento. Si es así, parentElement es null .

Como ejemplo:

document.body.parentNode; // the <html> element document.body.parentElement; // the <html> element document.documentElement.parentNode; // the document node document.documentElement.parentElement; // null (document.documentElement.parentNode === document); // true (document.documentElement.parentElement === document); // false

Dado que el elemento <html> ( document.documentElement ) no tiene un elemento primario que sea un elemento, parentElement es null . (Hay otros casos, más improbables, en los que parentElement podría ser null , pero probablemente nunca los encontrará).


Edit: algo de esto está mal. Ver comentarios a continuación para más detalles

Todos los objetos Element son también objetos Node (porque Element es un descendiente de Node ). Pero hay un Node que no es un Element ... el objeto de document . Entonces su elemento <html> tiene un nodo padre ( document ) pero no tiene un elemento padre.

La razón por la que existe la necesidad de parentElement lugar de parentNode es que, HTML5 no requiere estrictamente un elemento <html> , por lo que casi cualquier elemento puede tener un nodo principal sin tener realmente un elemento principal. Así que si mi página HTML se veía así:

<!doctype html> <title>My page</title> <header>This is my page</header> <div id="body"> <p>This is some text from my page</p> </div> <footer> Copyright, me </footer>

Luego, los elementos de title , header , #body y footer tendrían su parentNode como document , pero su elemento parentElement sería nulo. Solo la etiqueta p tendría un elemento parentElement , que es #body . (Tenga en cuenta que no recomendaría esto como una estructura de página ... apéguese a algo más tradicional).

Puedes replicarlo con algo como esto:

if (myElement.parentNode instanceof Element) { myElement.parentElement = myElement.parentNode; } else { myElement.parentElement = null; }