Quelqu'un peut-il m'expliquer en termes aussi simples que possible, quelle est la différence entre le DOM parentNode classique et nouvellement introduit dans Firefox 9 parentElement
Quelqu'un peut-il m'expliquer en termes aussi simples que possible, quelle est la différence entre le DOM parentNode classique et nouvellement introduit dans Firefox 9 parentElement
Réponses:
parentElement
est nouveau pour Firefox 9 et DOM4, mais il est présent dans tous les autres principaux navigateurs depuis des lustres.
Dans la plupart des cas, c'est la même chose que parentNode
. La seule différence survient lorsqu'un nœud parentNode
n'est pas un élément. Si oui, parentElement
c'est null
.
Par exemple:
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
Puisque l' <html>
élément ( document.documentElement
) n'a pas de parent qui est un élément, parentElement
est null
. (Il y a d'autres cas, plus improbables, où cela parentElement
pourrait être null
, mais vous ne les rencontrerez probablement jamais.)
parentElement
était une chose IE propriétaire; Je crois que d'autres navigateurs à l'époque (par exemple, Netscape) étaient pris en charge parentNode
mais pas parentElement
. (Évidemment, étant donné que j'ai mentionné Netscape, je parle de retour à IE5 et plus tôt ...)
documentfragment.firstChild.parentElement === null
circle
intérieur a g
), dans IE, parentElement
ne sera pas défini et parentNode
sera ce que vous recherchez. :(
Dans Internet Explorer, parentElement
n'est pas défini pour les éléments SVG, alors qu'il parentNode
est défini.
parentElement
n'est pas implémenté pour Node
est bien connu ( developer.mozilla.org/en-US/docs/Web/API/Node/… ) mais pour SVGElement
? Je ne pouvais pas non plus reproduire cela avec document.createElement('svg').parentElement
IE 11.737.17763.0. Cela a-t-il été résolu entre-temps?
Utilisez .parentElement
et vous ne pouvez pas vous tromper tant que vous n'utilisez pas de fragments de document.
Si vous utilisez des fragments de document, vous avez besoin de .parentNode
:
let div = document.createDocumentFragment().appendChild(document.createElement('div'));
div.parentElement // null
div.parentNode // document fragment
Aussi:
let div = document.getElementById('t').content.firstChild
div.parentElement // null
div.parentNode // document fragment
<template id="t"><div></div></template>
Apparemment , les <html>
s » .parentNode
liens vers le document . Cela devrait être considéré comme une phase de décision car les documents ne sont pas des nœuds, car les nœuds sont définis pour être contenus par des documents et les documents ne peuvent pas être contenus par des documents.
Tout comme avec nextSibling et nextElementSibling , rappelez-vous juste que, les propriétés avec "élément" dans leur nom retournent toujours Element
ou null
. Les propriétés sans peuvent renvoyer tout autre type de nœud.
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
il y a encore une différence, mais uniquement dans Internet Explorer. Cela se produit lorsque vous mélangez HTML et SVG. si le parent est «l'autre» de ces deux, alors .parentNode donne le parent, tandis que .parentElement donne undefined.
undefined
non null
.