¿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 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á).
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 ...)
documentfragment.firstChild.parentElement === null
circleinside a g), en IE, parentElementno estará definido, y parentNodeserá lo que estás buscando. :(
En Internet Explorer, parentElementno está definido para elementos SVG, mientras que parentNodeestá definido.
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?
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.
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
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.
undefinedno lo es null.