从DOM获取所有文本

时间:2013-09-08 15:43:28

标签: javascript dom google-chrome-extension treenode

好的,我有这个简单的HTML代码

<html>
    <head>
        <script src="jquery.js"></script>
        <script src="script.js"></script>
        <title>Get all text</title>
    </head>
    <body>
        <span>This is Thomas</span>
        This is Bar
        <div id="content">
            This is Foo.
        </div>
        <span>This is Bufu</span>
    </body>
</html>

我希望在变量中获取所有文本。所以我制作了这个javascript代码。但是“This is Foo”和“This is Bar”没有显示。

var sep = '~';

$(function() {
    pageTexts = getTextFromPage();
    console.log(pageTexts);  
});

function getTextFromPage()
{
    var pageText = '';
    i = 0;
    j = 0;
    var itr = document.createTreeWalker(
        document.getElementsByTagName("body")[0],
        NodeFilter.SHOW_TEXT,
        null, // no filter
        false
    );

    while(itr.nextNode()) 
    {     
        if (itr.currentNode.textContent.search("\t") && itr.currentNode.textContent.search("\n") && itr.currentNode.parentNode.nodeName.toLowerCase() != 'script' && itr.currentNode.parentNode.nodeName.toLowerCase() != 'noscript')
        {            
            if (i == 0)
            {
               pageText = itr.currentNode.textContent;
                i++; 
            } 
            else 
            {
                pageText = pageText + sep + itr.currentNode.textContent;
                i++;
            }       
        }
        charNumber = pageText.length;    
        elemNumber = i;      
    }
    return pageText;  
}

目前的结果是“这是托马斯〜这是布福”。而且我想要“这是托马斯〜这是酒吧〜这是Foo~这是Bufu”。谁能告诉我什么是错的或我该怎么办?我会答应任何有助于我的答案。 PS。这是一个chrome扩展,我需要从任何html页面获取所有文本,即使是一个非常复杂的页面。

1 个答案:

答案 0 :(得分:1)

您正在使用条件This is Bar过滤掉This is Foo.itr.currentNode.textContent.search("\n") 我不确定你在if语句中使用前两个条件尝试做什么,但是search在找不到针时返回-1并且-1是真正的

        if (/*itr.currentNode.textContent.search("\t") && 
             itr.currentNode.textContent.search("\n") &&*/ 
             itr.currentNode.parentNode.nodeName.toLowerCase() != 'script' && 
             itr.currentNode.parentNode.nodeName.toLowerCase() != 'noscript')

    var text = $.trim(itr.currentNode.textContent);
    if (text.length > 0 && itr.currentNode.parentNode.nodeName.toLowerCase() != 'script' && itr.currentNode.parentNode.nodeName.toLowerCase() != 'noscript')
    {            
        if (i == 0)
        {
           pageText = text;
            i++; 
        } 
        else 
        {
            pageText = pageText + sep + text;
            i++;
        }       
    }

http://jsfiddle.net/QEvFF/2/