Kann mir jemand so einfach wie möglich erklären, was der Unterschied zwischen klassischem DOM parentNode und neu in Firefox 9 parentElement neu eingeführt ist
Kann mir jemand so einfach wie möglich erklären, was der Unterschied zwischen klassischem DOM parentNode und neu in Firefox 9 parentElement neu eingeführt ist
Antworten:
parentElement
ist neu in Firefox 9 und in DOM4, aber es ist seit Ewigkeiten in allen anderen gängigen Browsern vorhanden.
In den meisten Fällen ist es dasselbe wie parentNode
. Der einzige Unterschied besteht darin, dass ein Knoten parentNode
kein Element ist. Wenn ja, parentElement
ist null
.
Als Beispiel:
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
Da das <html>
Element ( document.documentElement
) kein übergeordnetes Element hat, parentElement
ist es ein Element null
. (Es gibt andere, eher unwahrscheinliche Fälle, in denen parentElement
dies der Fall sein könnte null
, aber Sie werden wahrscheinlich nie auf sie stoßen.)
parentElement
war eine proprietäre IE-Sache; Ich glaube, dass andere Browser zu der Zeit (z. B. Netscape) unterstützt werden, parentNode
aber nicht parentElement
. (Angesichts der Tatsache, dass ich Netscape erwähnt habe, spreche ich natürlich von einem Weg zurück zu IE5 und früher ...)
documentfragment.firstChild.parentElement === null
circle
Inside-A g
) im IE parentElement
undefiniert und parentNode
genau das, wonach Sie suchen. :(
In Internet Explorer parentElement
ist für SVG-Elemente undefiniert, während parentNode
definiert ist.
parentElement
Nicht implementiert zu sein Node
ist bekannt ( developer.mozilla.org/en-US/docs/Web/API/Node/… ), aber für SVGElement
? Ich konnte dies auch nicht mit document.createElement('svg').parentElement
in IE 11.737.17763.0 reproduzieren. Wurde das vielleicht in der Zwischenzeit behoben?
Verwenden .parentElement
Sie und Sie können nichts falsch machen, solange Sie keine Dokumentfragmente verwenden.
Wenn Sie Dokumentfragmente verwenden, benötigen Sie .parentNode
:
let div = document.createDocumentFragment().appendChild(document.createElement('div'));
div.parentElement // null
div.parentNode // document fragment
Ebenfalls:
let div = document.getElementById('t').content.firstChild
div.parentElement // null
div.parentNode // document fragment
<template id="t"><div></div></template>
Anscheinend ist die <html>
s‘ .parentNode
Links zu dem Dokument . Dies sollte als Entscheidungsfehler angesehen werden, da Dokumente keine Knoten sind, da Knoten als in Dokumenten enthalten definiert sind und Dokumente nicht in Dokumenten enthalten sein können.
Denken Sie genau wie bei nextSibling und nextElementSibling daran, dass Eigenschaften mit "element" im Namen immer Element
oder zurückgeben null
. Eigenschaften ohne können jede andere Art von Knoten zurückgeben.
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
Es gibt noch einen Unterschied, aber nur im Internet Explorer. Es tritt auf, wenn Sie HTML und SVG mischen. Wenn das übergeordnete Element das 'andere' dieser beiden Elemente ist, gibt .parentNode das übergeordnete Element an, während .parentElement undefiniert angibt.
undefined
nicht null
.