Czy ktoś może mi wyjaśnić tak prosto, jak to możliwe, jaka jest różnica między klasycznym DOM ParentNode a nowo wprowadzonym w Firefox 9 parentElement
Czy ktoś może mi wyjaśnić tak prosto, jak to możliwe, jaka jest różnica między klasycznym DOM ParentNode a nowo wprowadzonym w Firefox 9 parentElement
Odpowiedzi:
parentElement
jest nowy w Firefoksie 9 i DOM4, ale był obecny we wszystkich innych głównych przeglądarkach od wieków.
W większości przypadków jest to to samo co parentNode
. Jedyna różnica pojawia się, gdy węzeł parentNode
nie jest elementem. Jeśli tak, parentElement
to jest null
.
Jako przykład:
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
Ponieważ <html>
element ( document.documentElement
) nie ma elementu nadrzędnego, który jest elementem, parentElement
jest null
. (Są inne, bardziej mało prawdopodobne, przypadki, w których parentElement
mogą być null
, ale prawdopodobnie nigdy ich nie spotkasz).
parentElement
był zastrzeżoną rzeczą IE; Wierzę, że inne przeglądarki w tym czasie (np. Netscape) były obsługiwane, parentNode
ale nie parentElement
. (Oczywiście, biorąc pod uwagę, że wspomniałem o Netscape, mówię o drodze powrotnej do IE5 i wcześniejszych ...)
documentfragment.firstChild.parentElement === null
circle
wnętrze a g
) w IE parentElement
będzie niezdefiniowany i parentNode
będzie tym, czego szukasz. :(
W Internet Explorerze parentElement
jest niezdefiniowany dla elementów SVG, natomiast parentNode
jest zdefiniowany.
parentElement
niewdrożenie Node
jest dobrze znane ( developer.mozilla.org/en-US/docs/Web/API/Node/… ), ale dla SVGElement
? Nie mogłem również odtworzyć tego document.createElement('svg').parentElement
w IE 11.737.17763.0. Czy w międzyczasie można to naprawić?
Użyj .parentElement
i nie możesz się pomylić, dopóki nie korzystasz z fragmentów dokumentu.
Jeśli korzystasz z fragmentów dokumentów, potrzebujesz .parentNode
:
let div = document.createDocumentFragment().appendChild(document.createElement('div'));
div.parentElement // null
div.parentNode // document fragment
Również:
let div = document.getElementById('t').content.firstChild
div.parentElement // null
div.parentNode // document fragment
<template id="t"><div></div></template>
Widocznie <html>
„s .parentNode
linki do Dokumentu . Należy to uznać za decyzję, ponieważ dokumenty nie są węzłami, ponieważ węzły są zdefiniowane jako zawierające dokumenty i dokumenty nie mogą być zawarte w dokumentach.
Podobnie jak w przypadku nextSibling i nextElementSibling , pamiętaj tylko, że właściwości z „elementem” w nazwie zawsze zwracają Element
lub null
. Właściwości bez mogą zwracać dowolny inny rodzaj węzła.
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
jest jeszcze jedna różnica, ale tylko w Internet Explorerze. Występuje podczas mieszania HTML i SVG. jeśli rodzic jest „drugim” z tych dwóch, to .parentNode daje rodzicowi, a .parentElement daje niezdefiniowany.
undefined
nie null
.