Je me demandais, JavaScript propose une variété de méthodes pour obtenir le premier élément enfant de n'importe quel élément, mais quelle est la meilleure? Au mieux, je veux dire: le plus compatible avec tous les navigateurs, le plus rapide, le plus complet et le plus prévisible en matière de comportement. Une liste de méthodes / propriétés que j'utilise comme alias:
var elem = document.getElementById('container');
var child = elem.children[0];
var child = elem.firstElementChild; // == children[0]
Cela fonctionne pour les deux cas:
var child = elem.childNodes[0]; // or childNodes[1], see below
C'est en cas de formes, ou d' <div>
itération. Si je pouvais rencontrer des éléments de texte:
var child = elem.childNodes; // treat as NodeList
var child = elem.firstChild;
Pour autant que je puisse travailler, firstChild
utilise la NodeList de childNodes
, et firstElementChild
utilise children
. Je fonde cette hypothèse sur la référence MDN:
childNode
est une référence au premier élément enfant du nœud d'élément, ounull
s'il n'y en a pas.
Je suppose que, en termes de vitesse, la différence, le cas échéant, ne sera presque rien, car il firstElementChild
s'agit effectivement d'une référence à children[0]
, et l' children
objet est déjà en mémoire de toute façon.
Ce qui me jette, c'est l' childNodes
objet. Je l'ai utilisé pour jeter un œil à un formulaire, dans un élément de table. Bien qu'il children
répertorie tous les éléments du formulaire, childNodes
il semble également inclure des espaces dans le code HTML:
console.log(elem.childNodes[0]);
console.log(elem.firstChild);
Les deux journaux <TextNode textContent="\n ">
console.log(elem.childNodes[1]);
console.log(elem.children[0]);
console.log(elem.firstElementChild);
Tous les journaux <input type="text"
… >
. Comment venir? Je comprendrais qu'un objet me permettrait de travailler avec le code HTML «brut», tandis que l'autre reste fidèle au DOM, mais l' childNodes
élément semble fonctionner aux deux niveaux.
Pour revenir à ma question initiale, je suppose que si je veux l'objet le plus complet, childNodes
c'est le chemin à parcourir, mais en raison de son exhaustivité, ce n'est peut-être pas le plus prévisible en termes de retour de l'élément que je veux / attendre à tout moment. La prise en charge de plusieurs navigateurs pourrait également s'avérer être un défi dans ce cas, bien que je puisse me tromper.
Quelqu'un pourrait-il clarifier la distinction entre les objets à portée de main? S'il y a une différence de vitesse, même négligeable, j'aimerais aussi le savoir. Si je vois tout cela de travers, n'hésitez pas à me renseigner.
PS: S'il vous plaît, s'il vous plaît, j'aime JavaScript, alors oui, je veux m'occuper de ce genre de choses. Les réponses comme «jQuery s'occupe de cela pour vous» ne sont pas ce que je recherche, donc nonjquery marque.