Может кто-нибудь объяснить мне как можно проще, какова разница между классическим DOM parentNode и недавно введена в Firefox 9 parentElement
Разница между DOM parentNode и parentElement
Ответ 1
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, но вы, вероятно, никогда не встретите их.)
Ответ 2
В Internet Explorer parentElement есть undefined для элементов SVG, тогда как parentNode определен.
Ответ 3
Используйте .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> Ответ 4
Изменить: Некоторые из этих ошибок неверны. Подробнее см. Комментарии ниже.
Все объекты Element также являются объектами Node (поскольку Element является потомком Node). Но существует Node, который не является объектом Element... document. Таким образом, ваш элемент <html> имеет родительский node (document), но у него нет родительского элемента.
Причина, по которой существует необходимость parentElement вместо parentNode, заключается в том, что HTML5 строго не требует элемента <html>, поэтому почти любой элемент может иметь родительский node без фактического наличия родительского элемента, Поэтому, если моя HTML-страница выглядит так:
<!doctype html>
<title>My page</title>
<header>This is my page</header>
<div id="body">
<p>This is some text from my page</p>
</div>
<footer>
Copyright, me
</footer>
Затем элементы title, header, #body и footer имели бы parentNode как document, но их parentElement были бы пустыми. Только тег p имеет parentElement, который равен #body. (Обратите внимание, что я бы не советовал это как структуру страницы... придерживаться чего-то более традиционного.)
Вы можете воспроизвести его примерно так:
if (myElement.parentNode instanceof Element) {
myElement.parentElement = myElement.parentNode;
} else {
myElement.parentElement = null;
}
Ответ 5
Как и с nextSibling и nextElementSibling, просто помните, что свойства с "элементом" в их имени всегда возвращают Element или null. Свойства без возврата другого типа node.
console.log(document.body.parentNode, "is body parent node"); // returns <html>
console.log(document.body.parentElement, "is body parent element"); // returns <html>
var html = document.body.parentElement;
console.log(html.parentNode, "is html parent node"); // returns document
console.log(html.parentElement, "is html parent element"); // returns null
Ответ 6
Есть еще одно отличие, но только в Internet Explorer. Это происходит, когда вы смешиваете HTML и SVG. если родитель является "другим" из этих двух, тогда .parentNode дает родителя, в то время как .parentElement дает неопределенное.