рекурсивный подсчет текстового узла с использованием JavaScript - PullRequest
4 голосов
/ 14 апреля 2011

Допустим, у меня есть такая пометка

<html id="test">
<body>
Some text node.
<div class="cool"><span class="try">This is another text node.</span></div>
Yet another test node.
</body>
</html>

мой код js

function countText(node){
 var counter = 0;
 if(node.nodeType === 3){
     counter+=node.nodeValue.length;
     countText(node);
 }
 else{}
}

Теперь, если я хочу посчитать текстовые узлы

console.log("count text : " + countText(document.getElementById("test"));

это должно вернуть мне счет, но он не работает и, кроме того, что я должен поставить в другом состоянии.Я никогда не использовал nodeType, поэтому возникли проблемы с его использованием.Любая помощь будет оценена.

Ответы [ 2 ]

7 голосов
/ 14 апреля 2011

В вашем коде есть пара ошибок:

  • Ваш 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;
}
1 голос
/ 14 апреля 2011

Вы хотите что-то вроде

function countTextNodes(node) {
    var n = 0;
    if(node.nodeType == 3)
        n = 1;
    for(var i = 0; i < node.childNodes.length; ++i)
        n += countTextNodes(node.childNodes[i]);
    return n;
}

Это может быть сжато в более компактный код, но я пошел для разборчивости здесь.

Вызовите это в корне, в котором вы хотите посчитать текстовые узлы. Например, для подсчета текстовых узлов по всему документу вы должны вызвать countTextNodes(document.getDocumentElement()).

...