270 votes

meilleure façon d'obtenir des nœuds enfants

Je me demandais, JavaScript offre une variété de méthodes pour obtenir le premier élément enfant à partir de n'importe quel élément... mais lequel est le meilleur? Par meilleur, je veux dire: la plupart de la croix-navigateur compatible, plus rapide, plus complète et plus prévisible quand il s'agit d'un comportement. Une liste des méthodes/propriétés-je utiliser 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 dans le cas des formes, ou des div itération. Si je pouvais rencontrer des éléments de texte:

var child = elem.childNodes;//treat as Nodelist
var child = elem.firstChild;

Aussi loin que je peux travailler, firstChild utilise la Nodelist de childNodes, et firstElementChild utilise children. Je suis fonder cette hypothèse sur le MDN référence:

childNode est une référence au premier élément enfant de l'élément de nœud, ou null si il n'existe pas.

Je suppose que, en termes de vitesse de la différence, le cas échéant, sera à côté de rien du tout, depuis firstElementChild est effectivement une référence à l' children[0], et l' children objet est déjà dans la mémoire de toute façon.

Ce qui ne me jeter est l' childNodes objet. Je l'ai utilisé pour prendre un coup d'oeil à une forme, à un élément de tableau. Alors qu' children répertorie tous les éléments de formulaire, childNodes semble également inclure les espaces du code html:

console.log(elem.childNodes[0]);
console.log(elem.firstChild);

à la fois journal <TextNode textContent="\n ">

console.log(elem.childNodes[1]);
console.log(elem.children[0]);
console.log(elem.firstElementChild);

Tous les log <input type="text"... Comment ça se fait? Je comprendrais qu'un objet puisse me permettre de travailler avec les "brutes" code HTML, alors que les autres bâtons pour les DOM, mais l' childNodes élément semble fonctionner sur les deux niveaux.

Pour revenir à ma question initiale: je dirais: si je veux le plus complet de l'objet, childNodes est le chemin à parcourir, mais à cause de son exhaustivité, il pourrait ne pas être le plus prévisible en termes de retour à l'élément que je veux/s'attendre à un moment donné. La croix-prise en charge du navigateur peut aussi s'avérer être un défi en ce cas, bien que j'ai peut-être tort.

Quelqu'un pourrait-il clarifier la distinction entre les objets à portée de main? Si il y a une différence de vitesse, cependant négligeable, je voudrais savoir, aussi. Si je le vois tous mal, n'hésitez pas à m'instruire :-).

PS: s'il vous plaît, s'il vous plaît, j'aime le JavaScript, donc oui, je veux faire face à ce genre de chose. des réponses comme "jQuery traite de cela pour vous' ne sont pas ce que je cherche, donc pas de jQuery tag.

254voto

Tim Down Points 124501

On dirait que vous êtes d'avoir à y penser. Vous avez observé la différence entre childNodes et children, qui est qu' childNodes contient tous les nœuds, y compris les nœuds de texte entièrement composé d'espaces, tout en children est une collection de seulement les nœuds enfants qui sont des éléments. C'est vraiment tout là est à lui.

Il n'y a rien d'imprévisible à propos de la collecte, mais il ya un couple de questions à savoir:

  • IE <= 8 ne comprennent pas blanc, espace texte seulement les nœuds childNodes , tandis que les autres navigateurs n'
  • IE <= 8 comprend les nœuds de commentaires dans children , tandis que les autres navigateurs n'ont éléments

children, firstElementChild et les amis sont juste des convenances, présentant une vue filtrée du DOM restreint aux éléments.

24voto

neu-rah Points 1022

firstElementChild peuvent ne pas être disponibles dans IE<9 (seulement firstChild)

sur IE<9 firstChild est le firstElementChild parce que MS DOM (IE<9) n'est pas le stockage de vide nœuds de texte. Mais si vous le faites sur d'autres navigateurs qu'ils seront de retour à vide des nœuds de texte...

ma solution

child=(elem.firstElementChild||elem.firstChild)

cela donnera à l'firstchild même sur IE<9

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X