В вашем коде есть пара ошибок:
- Ваш HTML-код искажен.
- Вы добавляете текст в
counter
вместо его увеличения.
- Вы никогда не зацикливаетесь на дочерних узлах узла, вы всегда передаете один и тот же узел рекурсивному вызову.
- Вы ничего не делаете, если узел не является текстовым узлом.
Это будет работать:
function countText(node){
var counter = 0;
if(node.nodeType === 3){
counter++;
}
else if(node.nodeType === 1) { // if it is an element node,
var children = node.childNodes; // examine the children
for(var i = children.length; i--; ) {
counter += countText(children[i]);
}
}
return counter;
}
alert(countText(document.body));
DEMO
Какой номер соответствует какому типу узла можно найти здесь .
Обновление:
Если вы хотите посчитать слова , сначала нужно разбить каждый текстовый узел на слова. Далее я предполагаю, что слова разделены пробелами:
if(node.nodeType === 3){
counter = node.nodeValue.split(/\s+/g).length;
}
Обновление 2
Я знаю, что вы хотите использовать рекурсивную функцию, но если вы хотите считать только слова, то есть гораздо более простой и эффективный способ:
function countWords(node){
// gets the text of the node and all its descendants
var text = node.innerText || node.textContent
return text.split(/\s+/g).length;
}