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 parentNodekein Element ist. Wenn ja, parentElementist 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, parentElementist es ein Element null. (Es gibt andere, eher unwahrscheinliche Fälle, in denen parentElementdies der Fall sein könnte null, aber Sie werden wahrscheinlich nie auf sie stoßen.)
parentElementwar eine proprietäre IE-Sache; Ich glaube, dass andere Browser zu der Zeit (z. B. Netscape) unterstützt werden, parentNodeaber 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
circleInside-A g) im IE parentElementundefiniert und parentNodegenau das, wonach Sie suchen. :(
In Internet Explorer parentElementist für SVG-Elemente undefiniert, während parentNodedefiniert ist.
parentElementNicht implementiert zu sein Nodeist bekannt ( developer.mozilla.org/en-US/docs/Web/API/Node/… ), aber für SVGElement? Ich konnte dies auch nicht mit document.createElement('svg').parentElementin IE 11.737.17763.0 reproduzieren. Wurde das vielleicht in der Zwischenzeit behoben?
Verwenden .parentElementSie 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‘ .parentNodeLinks 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 Elementoder 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.
undefinednicht null.