J'essaie de faire une boucle sur TOUS les éléments d'une page, je veux donc vérifier chaque élément qui existe sur cette page pour une classe spéciale.
Alors, comment dire que je veux vérifier CHAQUE élément?
javascript
dom
Florian Müller
la source
la source
document.body.getElementsByTagName('*')
for (... of ...) { }
Réponses:
Vous pouvez passer un
*
àgetElementsByTagName()
pour qu'il renvoie tous les éléments d'une page:Notez que vous pouvez utiliser
querySelectorAll()
, s'il est disponible (IE9 +, CSS dans IE8), pour trouver simplement des éléments avec une classe particulière.Cela accélérerait certainement les choses pour les navigateurs modernes.
Les navigateurs prennent désormais en charge foreach sur NodeList . Cela signifie que vous pouvez directement boucler les éléments au lieu d'écrire votre propre boucle for.
la source
all[i]
vous donnerait l'élément actuel.getElementsByClassName()
a un support pire quequerySelectorAll()
(le premier n'est pas pris en charge dans IE 8). L'OP a clairement indiqué qu'il souhaitait boucler tous les éléments d'une page, pour laquelle je lui ai donné la solution et proposé une alternative. Je ne sais pas quel est le problème avec ça ;-).Je cherchais la même chose. Eh bien, pas exactement. Je voulais seulement lister tous les nœuds DOM.
Pour obtenir des éléments avec une classe spécifique, nous pouvons utiliser la fonction de filtre.
Solution trouvée sur MDN
la source
document.body.getElementsByTagName('*')
pourraient renvoyer les nœuds dans un ordre brouillé.Comme toujours, la meilleure solution est d'utiliser la récursivité:
Contrairement à d'autres suggestions, cette solution ne vous oblige pas à créer un tableau pour tous les nœuds, donc c'est plus léger sur la mémoire. Plus important encore, il trouve plus de résultats. Je ne sais pas quels sont ces résultats, mais lors des tests sur chrome, il trouve environ 50% de nœuds en plus par rapport à
document.getElementsByTagName("*");
la source
document.getElementsByTagName("*");
» - oui, il trouvera des nœuds de texte et des nœuds de commentaire ainsi que des nœuds d'élément . Comme le PO ne posait que des questions sur les éléments, ce n'est pas nécessaire.NodeList
fait simplement référence auxNode
s qui sont déjà construits dans votre DOM, donc ce n'est pas aussi lourd que vous pourriez l'imaginer. Quelqu'un qui en sait plus peut peser, mais je pense que c'est juste une taille de référence de mémoire, donc 8 octets par nœud.Voici un autre exemple sur la façon dont vous pouvez parcourir un document ou un élément:
la source
Pour ceux qui utilisent Jquery
la source
Andy E. a donné une bonne réponse.
J'ajouterais que si vous avez envie de sélectionner tous les enfants dans un sélecteur spécial (ce besoin m'est arrivé récemment), vous pouvez appliquer la méthode "getElementsByTagName ()" sur n'importe quel objet DOM de votre choix.
Pour un exemple, je devais simplement analyser la partie "visuelle" de la page Web, donc je viens de faire ceci
Cela ne prendra jamais en considération la partie tête.
la source
à partir de ce lien
référence javascript
MISE À JOUR: MODIFIER
depuis ma dernière réponse, j'ai trouvé une meilleure solution plus simple
la source
document.all
est découragée en faveur dedocument.getElementBy*
.Utilisation
*
la source
je pense que c'est vraiment rapide
la source
Obtenir tous les éléments en utilisant
var all = document.getElementsByTagName("*"); for (var i=0, max=all.length; i < max; i++);
est acceptable si vous devez vérifier chaque élément, mais cela entraînera la vérification ou la mise en boucle d'éléments ou de texte répétitifs.Voici une implémentation de récursivité qui vérifie ou boucle chaque élément de tous les éléments DOM une seule fois et ajoute:
(Crédits à @George Reith pour sa réponse sur la récursivité ici: Mapper HTML en JSON )
la source
Vous pouvez essayer avec
document.getElementsByClassName('special_class');
la source
getElementsByClassName()
et n'est pas prise en charge par Internet Explorer jusqu'à la version 9.