Diferencia entre DOM parentNode y parentElement


501

¿Alguien puede explicarme en términos lo más simples posibles, cuál es la diferencia entre el DOM parentNode clásico y el recién introducido en Firefox 9 parentElement




44
parentNode parece ser el estándar DOM, por lo que es más seguro usarlo siempre en lugar de parentElement.
TMS

55
@TMS w3school no es una autoridad: w3fools.com
Guillaume Massé

Respuestas:


487

parentElement es nuevo en Firefox 9 y 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 un nodo parentNodeno es un elemento. Si es así, parentElementes 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 <html>elemento ( document.documentElement) no tiene un elemento primario que sea un elemento, parentElementes null. (Hay otros casos, más improbables, en los que parentElementpodría haber null, pero probablemente nunca los encontrará).


162
En otras palabras, es completamente inútil el 99.999999999999% del tiempo. ¿De quién fue la idea?
Niet the Dark Absol

25
El original parentElementera una cosa propietaria de IE; Creo que otros navegadores en ese momento (por ejemplo, Netscape) admitían parentNodepero no parentElement. (Obviamente, dado que he mencionado Netscape, estoy hablando de volver manera de IE5 y anteriores ...)
nnnnnn

99
@lonesomeday olvidastedocumentfragment.firstChild.parentElement === null
Raynos

77
@Raynos Esa fue en realidad la circunstancia precisa que tenía en mente con la última oración de mi respuesta ...
lonesomeday

17
Como acabo de descubrir, en un elemento SVG (como un circleinside a g), en IE, parentElementno estará definido, y parentNodeserá lo que estás buscando. :(
Jason Walton

94

En Internet Explorer, parentElementno está definido para elementos SVG, mientras que parentNodeestá definido.


10
Sinceramente, creo que esto es más un comentario que una respuesta.
shabunc

39
Probablemente, pero es la razón por la que me golpeé la cabeza contra la mesa durante una hora o más hasta que lo descubrí. Sospecho que muchos otros vienen a esta página después de un golpe similar.
Speedplane

3
@speedplane feliz de que esto es una respuesta ya que esto no tiene sentido lógico y me tenía confundido por un buen tiempo ...
superfónicos

1
También está indefinido para los nodos de comentarios. En Chrome, recibí el comentario de un padre, pero no estaba definido en IE.
Simon_Weaver

No pude encontrar una fuente para eso. parentElementno se implementa para Nodees bien conocido ( developer.mozilla.org/en-US/docs/Web/API/Node/… ) pero para SVGElement? Tampoco pude reproducir esto document.createElement('svg').parentElementen IE 11.737.17763.0. ¿Se solucionó esto mientras tanto?
epsilon

14

Use .parentElementy no puede equivocarse mientras no esté usando 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 los enlaces de <html>'s .parentNodeal documento . Esto se debe considerar un proceso de decisión ya que los documentos no son nodos, ya que los nodos están definidos para que los documentos puedan contenerlos y los documentos no pueden estar contenidos en ellos.


6

Al igual que con nextSibling y nextElementSibling , solo recuerde que las propiedades con "elemento" en su nombre siempre devuelven Elemento 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

1
sí, pero a diferencia del siguiente texto o los nodos de comentarios no pueden ser padres.
Jasen

0

Hay una diferencia más, pero solo en Internet Explorer. Ocurre cuando mezclas HTML y SVG. si el padre es el 'otro' de esos dos, entonces .parentNode da el padre, mientras que .parentElement da indefinido.


1
Creo que undefinedno lo es null.
Brian Di Palma el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.