Differenza tra DOM parentNode e parentElement


501

Qualcuno può spiegarmi in termini il più semplici possibile, qual è la differenza tra il classico ParentNode DOM e quello appena introdotto in Firefox 9 parentElement




4
parentNode sembra essere DOM standard, quindi è più sicuro usarlo sempre invece di parentElement.
TMS,

5
@TMS w3school non è un'autorità: w3fools.com
Guillaume Massé

Risposte:


487

parentElement è una novità di Firefox 9 e DOM4, ma è presente in tutti gli altri principali browser da anni.

Nella maggior parte dei casi, è lo stesso di parentNode. L'unica differenza arriva quando un nodo parentNodenon è un elemento. Se è così, lo parentElementè null.

Come esempio:

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

Poiché l' <html>elemento ( document.documentElement) non ha un genitore che è un elemento, lo parentElementè null. (Ci sono altri casi, più improbabili, dove parentElementpotrebbero essere null, ma probabilmente non li incontrerai mai.)


162
In altre parole, è del tutto inutile il 99.999999999999% delle volte. Di chi è stata l'idea?
Niet the Dark Absol,

25
L'originale parentElementera una cosa proprietaria di IE; Credo che altri browser all'epoca (ad es. Netscape) siano supportati parentNodema non parentElement. (Ovviamente, dato che ho menzionato Netscape, sto parlando di ritorno a IE5 e precedenti ...)
nnnnnn

9
@lonesomeday hai dimenticatodocumentfragment.firstChild.parentElement === null
Raynos

7
@Raynos Questa era in realtà la circostanza precisa che avevo in mente con l'ultima frase della mia risposta ...
lonesomeday

17
Come ho appena scoperto, su un elemento SVG (come un circleinterno a g), in IE, parentElementnon sarà definito e parentNodesarà ciò che stai cercando. :(
Jason Walton,

94

In Internet Explorer, parentElementnon è definito per gli elementi SVG, mentre parentNodeè definito.


10
onestamente penso che sia più un commento che una risposta.
Shabunc,

39
Probabilmente, ma è la ragione per cui ho sbattuto la testa contro il tavolo per un'ora o più finché non l'ho capito. Sospetto che molti altri vengano su questa pagina dopo un simile colpo alla testa.
speedplane il

3
@speedplane Glad questa è una risposta come questa non ha senso logico e mi aveva perplesso per un bel po '...
superphonic

1
Inoltre, non definito per i nodi di commento. In Chrome stavo ottenendo felicemente il genitore di un commento, ma non era definito in IE.
Simon_Weaver,

Non sono riuscito a trovare una fonte per questo. parentElementnon essere implementato per Nodeè ben noto ( developer.mozilla.org/en-US/docs/Web/API/Node/… ) ma per SVGElement? Inoltre non ho potuto riprodurre questo con document.createElement('svg').parentElementIE 11.737.17763.0. Forse è stato risolto nel frattempo?
epsilon

14

Usa .parentElemente non puoi sbagliare fintanto che non stai usando frammenti di documenti.

Se si utilizzano frammenti di documenti, è necessario .parentNode:

let div = document.createDocumentFragment().appendChild(document.createElement('div'));
div.parentElement // null
div.parentNode // document fragment

Anche:

let div = document.getElementById('t').content.firstChild
div.parentElement // null
div.parentNode // document fragment
<template id="t"><div></div></template>


Apparentemente <html>i .parentNodecollegamenti al documento . Questo dovrebbe essere considerato una decisione decisiva poiché i documenti non sono nodi poiché i nodi sono definiti come contenibili da documenti e i documenti non possono essere contenuti da documenti.


6

Proprio come con nextSibling e nextElementSibling , basta ricordare che le proprietà con "element" nel loro nome restituiscono sempre Elemento null. Le proprietà senza possono restituire qualsiasi altro tipo di nodo.

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
sì, ma a differenza dei nodi di testo o commenti vicini non possono essere genitori.
Jasen,

0

c'è un'altra differenza, ma solo in Internet Explorer. Si verifica quando si mescolano HTML e SVG. se il genitore è "l'altro" di quei due, allora .parentNode fornisce il genitore, mentre .parentElement dà undefined.


1
Penso di undefinedno null.
Brian Di Palma,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.