¿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
¿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
Respuestas:
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 parentNode
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 <html>
elemento ( 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 haber null
, pero probablemente nunca los encontrará).
parentElement
era una cosa propietaria de IE; Creo que otros navegadores en ese momento (por ejemplo, Netscape) admitían parentNode
pero no parentElement
. (Obviamente, dado que he mencionado Netscape, estoy hablando de volver manera de IE5 y anteriores ...)
documentfragment.firstChild.parentElement === null
circle
inside a g
), en IE, parentElement
no estará definido, y parentNode
será lo que estás buscando. :(
En Internet Explorer, parentElement
no está definido para elementos SVG, mientras que parentNode
está definido.
parentElement
no se implementa para Node
es bien conocido ( developer.mozilla.org/en-US/docs/Web/API/Node/… ) pero para SVGElement
? Tampoco pude reproducir esto document.createElement('svg').parentElement
en IE 11.737.17763.0. ¿Se solucionó esto mientras tanto?
Use .parentElement
y 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 .parentNode
al 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.
Al igual que con nextSibling y nextElementSibling , solo 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
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.
undefined
no lo es null
.