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 parentNoden'est pas un élément. Si oui, parentElementc'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, parentElementest null. (Il y a d'autres cas, plus improbables, où cela parentElementpourrait ê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 parentNodemais pas parentElement. (Évidemment, étant donné que j'ai mentionné Netscape, je parle de retour à IE5 et plus tôt ...)
documentfragment.firstChild.parentElement === null
circleintérieur a g), dans IE, parentElementne sera pas défini et parentNodesera ce que vous recherchez. :(
Dans Internet Explorer, parentElementn'est pas défini pour les éléments SVG, alors qu'il parentNodeest défini.
parentElementn'est pas implémenté pour Nodeest 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').parentElementIE 11.737.17763.0. Cela a-t-il été résolu entre-temps?
Utilisez .parentElementet 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 » .parentNodeliens 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 Elementou 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.
undefinednon null.