Різниця між DOM parentNode та parentElement


500

Чи може хтось пояснити мене якомога простішими термінами, в чому різниця між класичним батьківським вузлом DOM та нововведеним у Firefox 9 parentElement




4
Здається, батьківський вузол є стандартом DOM, тому безпечніше завжди використовувати його замість parentElement.
— TMS

5
@TMS w3school не є авторитетом: w3fools.com
— Guillaume Massé

Відповіді:


486

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, але ви, ймовірно, ніколи не натрапите на них.)


162
Іншими словами, це абсолютно безглуздо в 99,999999999999% часу. Чия це була ідея?
— Niet the Dark Absol

25
Оригінал parentElementбув власною річчю IE; Я вважаю, що інші веб-переглядачі (наприклад, Netscape) підтримували, parentNodeале ні parentElement. (Очевидно, враховуючи, що я вже згадував Netscape, я говорю про зворотний шлях до IE5 і раніше ...)
— nnnnnn

9
@lonesomeday ти забувdocumentfragment.firstChild.parentElement === null
— Raynos

7
@Raynos Це була фактично точна обставина, яку я мав на увазі в останньому реченні моєї відповіді ...
— lonesomeday

17
Як я нещодавно з’ясував, елемент SVG (як, наприклад, circleвсередині a g), в IE, parentElementбуде невизначений і parentNodeбуде тим, що ви шукаєте. :(
— Джейсон Уолтон

94

В Internet Explorer parentElementне визначено елементів SVG, тоді parentNodeяк визначено.


10
чесно кажучи, я думаю, що це скоріше коментар, а не відповідь.
— shabunc

38
Напевно, але це причина, що я головою об стіл стукав годину і більше, поки не зрозумів. Я підозрюю, що багато інших приходять на цю сторінку після подібного удару по голові.
— швидкісний літак

3
@speedplane Радий, що це відповідь, тому що це не має жодного логічного сенсу, і мені довелося наткнутися на довгий час ...
— superphonic

1
Він також не визначений для вузлів коментарів. У Chrome я із задоволенням отримав батьківський коментар, але це не було визначено в IE.
— Simon_Weaver

Я не міг знайти для цього джерела. parentElementне реалізується для Nodeдобре відомо ( developer.mozilla.org/en-US/docs/Web/API/Node/… ), але для SVGElement? Я також не міг цього відтворити document.createElement('svg').parentElementв IE 11.737.17763.0. Це, можливо, тим часом було виправлено?
— epsilon

14

Використовуйте, .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посилання на Документ . Це слід вважати фазою прийняття рішення, оскільки документи не є вузлами, оскільки визначено, що вузли можуть бути доступними документами, а документи не можуть міститись у документах.


6

Так само, як і 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

1
так, але на відміну від зв’язків із текстом чи коментарями, не можуть бути батьківськими.
— Ясен

0

Є ще одна різниця, але тільки в Internet Explorer. Це відбувається при змішуванні HTML і SVG. якщо батько є "іншим" з цих двох, то .parentNode дає батькові, тоді як .parentElement дає невизначений.


1
Я думаю, що це undefinedне так null.
— Брайан Ді Пальма
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.