Javascript не может извлечь текст из HTML

Я сделал это, чтобы попытаться извлечь текст.

<script type = "text/javascript">
function extractText(node){
    var all = "";
    for (node=node.firstChild;node;node=node.nextSibling){
        alert(node.nodeValue + " = " + node.nodeType);
        if (node.nodeType == 3){
            all += node.nodeValue   
        }
    }
    alert(all);
}
</script>

Он находится в заголовке html-документа. Тело выглядит так...

<body onload = "extractText(document.body)">
Stuff
<b>text</b>
<script>
var x = 1;
</script>
</body>

Проблема в том, что alert(all); показывает только "Материалы" и добавляет кучу пустых вещей, которые я не совсем понимаю при выполнении alert(node.nodeValue + " = " + node.nodeType);. Он говорит null = 3 несколько раз. Может ли кто-нибудь сказать мне, почему это не работает должным образом? Заранее спасибо.


person Ostap Hnatyuk    schedule 27.12.2012    source источник


Ответы (2)


Если вам нужен текст из документа, вы можете заглянуть в рекурсивный вызов. Однако, если вы не заботитесь о детях, удалите первое условие if (node.hasChildNodes()){} в следующем:

function extractText(node){
    var txt = '';
    // recursive exploration and option to uncomment the check for a <script>
    // <script>s will have children as the the actual portion being executed
    // is considered a text node (nodeType===3)
    if (node.hasChildNodes()/* && node.nodeName !== 'SCRIPT'*/){
        for (var c = 0; c < node.childNodes.length; c++){
            txt += extractText(node.childNodes[c]);
        }
    }else if(node.nodeType===3){
        txt += node.textContent;
    }
    return txt;
}
alert(extractText(document.body));

Кроме того, вы, вероятно, захотите получить textContent поверх nodeValue, но это ваша вызов. Вы также можете получить более подробную информацию и проверить, является ли nodeName SCRIPT и игнорировать, если (если вы так решили), но я позволю вам принять это решение.

Последующие действия: вот скрипт, с которым вы можете поиграть, с комментариями к тесту <script> и необязательным удалением пробелов: http://jsfiddle.net/KZuk5/2/

person Brad Christie    schedule 27.12.2012
comment
Хм, кажется, все еще захватывает var x =1; - person Ostap Hnatyuk; 27.12.2012
comment
@OstapHnatyuk: Посмотрите на jsfiddle, который я опубликовал, и раскомментируйте часть nodeName=='script'. Кроме того, если вам не нужны пробелы (например, новые строки), см. эту версию. - person Brad Christie; 27.12.2012
comment
О, это было закомментировано, ха-ха, я этого не заметил. Работает отлично, спасибо за помощь. Это тоже немного помогло мне понять. - person Ostap Hnatyuk; 27.12.2012

Существуют разные типы узлов — в частности, мы рассматриваем два, текстовый узел и узел HTML. Текстовый узел является объектом и имеет свойство с именем nodeValue (к которому вы правильно обращаетесь). Однако у HTML-узлов нет свойства nodeValue (точнее, оно установлено в null).

Чтобы получить внутреннее значение узла HTML, используйте .innerHTML.

person Snuffleupagus    schedule 27.12.2012