Может кто-нибудь объяснить мне как можно проще, в чем разница между классическим DOM parentNode и недавно представленным в Firefox 9 parentElement?
Может кто-нибудь объяснить мне как можно проще, в чем разница между классическим DOM parentNode и недавно представленным в 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>
«S .parentNode
ссылки на документ . Это следует рассматривать как этап принятия решения, поскольку документы не являются узлами, поскольку узлы определены как содержащиеся в документах, а документы не могут содержаться в документах.
Как и в случае с nextSibling и nextElementSibling , просто запомните, что свойства с именем «element» всегда возвращают 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
.