Чи може хтось пояснити мене якомога простішими термінами, в чому різниця між класичним батьківським вузлом DOM та нововведеним у Firefox 9 parentElement
Чи може хтось пояснити мене якомога простішими термінами, в чому різниця між класичним батьківським вузлом DOM та нововведеним у Firefox 9 parentElement
Відповіді:
parentElement
є новим для Firefox 9 та DOM4, але він присутній у всіх інших основних браузерах протягом століть.
У більшості випадків це те саме, що parentNode
. Єдина різниця полягає в тому випадку, коли вузол parentNode
не є елементом. Якщо так, то parentElement
є null
.
Як приклад:
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
Оскільки <html>
елемент ( document.documentElement
) не має батьківського, який є елементом, parentElement
є null
. (Є й інші, малоймовірніші випадки, коли це parentElement
може бути null
, але ви, ймовірно, ніколи не натрапите на них.)
parentElement
був власною річчю IE; Я вважаю, що інші веб-переглядачі (наприклад, Netscape) підтримували, parentNode
але ні parentElement
. (Очевидно, враховуючи, що я вже згадував Netscape, я говорю про зворотний шлях до IE5 і раніше ...)
documentfragment.firstChild.parentElement === null
circle
всередині a g
), в IE, parentElement
буде невизначений і parentNode
буде тим, що ви шукаєте. :(
В Internet Explorer parentElement
не визначено елементів SVG, тоді parentNode
як визначено.
parentElement
не реалізується для Node
добре відомо ( developer.mozilla.org/en-US/docs/Web/API/Node/… ), але для SVGElement
? Я також не міг цього відтворити document.createElement('svg').parentElement
в IE 11.737.17763.0. Це, можливо, тим часом було виправлено?
Використовуйте, .parentElement
і ви не можете помилитися, доки не використовуєте фрагменти документа.
Якщо ви використовуєте фрагменти документа, вам потрібно .parentNode
:
let div = document.createDocumentFragment().appendChild(document.createElement('div'));
div.parentElement // null
div.parentNode // document fragment
Також:
let div = document.getElementById('t').content.firstChild
div.parentElement // null
div.parentNode // document fragment
<template id="t"><div></div></template>
Мабуть <html>
, .parentNode
посилання на Документ . Це слід вважати фазою прийняття рішення, оскільки документи не є вузлами, оскільки визначено, що вузли можуть бути доступними документами, а документи не можуть міститись у документах.
Так само, як і nextSibling та nextElementSibling , просто пам’ятайте про це, властивості з "елементом" у своєму імені завжди повертаються Element
або null
. Властивості без можуть повертати будь-який інший тип вузла.
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
Є ще одна різниця, але тільки в Internet Explorer. Це відбувається при змішуванні HTML і SVG. якщо батько є "іншим" з цих двох, то .parentNode дає батькові, тоді як .parentElement дає невизначений.
undefined
не так null
.