Si vous savez que la DIV est que va avoir du texte dans, vous pouvez KISS:
var count = document.getElementById('content').innerHTML.split(' ').length;
Si la div peut avoir des balises HTML dans, vous êtes va devoir traverser ses enfants à la recherche de nœuds de texte:
function get_text(el) {
ret = "";
var length = el.childNodes.length;
for(var i = 0; i < length; i++) {
var node = el.childNodes[i];
if(node.nodeType != 8) {
ret += node.nodeType != 1 ? node.nodeValue : get_text(node);
}
}
return ret;
}
var words = get_text(document.getElementById('content'));
var count = words.split(' ').length;
Ceci est la même logique que la bibliothèque jQuery utilise pour atteindre e Effet de sa fonction text()
. jQuery est une bibliothèque assez géniale qui, dans ce cas, n'est pas nécessaire. Cependant, si vous vous trouvez à faire beaucoup de manipulation DOM ou AJAX, alors vous voudrez peut-être vérifier.
EDIT:
Comme l'a souligné Gumbo dans les commentaires, la façon dont nous répartissons les chaînes ci-dessus serait compter deux espaces consécutifs comme un mot. Si vous vous attendez à ce genre de chose (et même si vous ne le faites pas), il est probablement préférable de l'éviter en divisant une expression régulière plutôt que par un simple espace. En gardant cela à l'esprit, au lieu de faire la scission ci-dessus, vous devriez faire quelque chose comme ceci:
var count = words.split(/\s+/).length;
La seule différence sur ce que nous transmettons à la fonction split.
Vous devez obtenir le noeud texte en premier. – cgp
parfait! merci – givp
Cela comptera des étiquettes comme mots cependant, c'est pourquoi je préférerais la version de text() fournie par jQuery. – cgp