2010-02-10 3 views
23

Je suis sûr que c'est simple mais je n'ai aucune idée de comment le faire. Comment puis-je compter le nombre d'éléments DOM dans ma page HTML? Je voulais le faire dans un userscript ou un bookmarklet mais je n'ai aucune idée de comment commencer!Firefox ou JavaScript, compte le DOM

+1

Voulez-vous connaître les nœuds DOM ou les nœuds DOM qui sont des éléments HTML? Le DOM inclut des éléments tels que du texte, des commentaires et des attributs en tant que nœuds. – edeverett

Répondre

60

Utilisez ce pour Element nœuds:

document.getElementsByTagName("*").length 

Pour un nœud, vous pouvez étendre Node comme ceci:

Node.prototype.countChildNodes = function() { 
    return this.hasChildNodes() 
    ? Array.prototype.slice.apply(this.childNodes).map(function(el) { 
     return 1 + el.countChildNodes(); 
     }).reduce(function(previousValue, currentValue, index, array){ 
     return previousValue + currentValue; 
     }) 
    : 0; 
}; 

Ensuite, tout ce que vous devez faire est d'appeler document.countChildNodes.

+0

est-il un moyen d'ajouter le nombre d'éléments à l'intérieur des iframes? – corretge

+0

@corretge Ce serait possible si vous avez accès au 'contentDocument'. Juste itérer les éléments que vous obtenez avec 'document.getElementsByTagName (" * ")' et les compter comme 1 et pour chaque noeud d'élément 'iframe' (' tagName === 'IFRAME'') ajouter le nombre d'éléments dans son 'contentDocument 'à la place. – Gumbo

+0

Merci beaucoup! J'ai un autre petit problème: les domaines, les protocoles et les ports doivent correspondre. Normal :) – corretge

3

// Vous pouvez utiliser la même méthode pour obtenir le nombre de chaque étiquette, si elle importe

function tagcensus(pa){ 
    pa= pa || document; 
    var O= {}, 
    A= [], tag, D= pa.getElementsByTagName('*'); 
    D= A.slice.apply(D, [0, D.length]); 
    while(D.length){ 
     tag= D.shift().tagName.toLowerCase(); 
     if(!O[tag]) O[tag]= 0; 
     O[tag]+= 1; 
    } 
    for(var p in O){ 
     A[A.length]= p+': '+O[p]; 
    } 
    A.sort(function(a, b){ 
     a= a.split(':')[1]*1; 
     b= b.split(':')[1]*1; 
     return b-a; 
    }); 
    return A.join(', '); 
} 

alerte (tagcensus())

2

En JavaScript vous pouvez faire

document.getElementsByTagName("*").length 

En jQuery vous pouvez faire

jQuery('*').length