Javascript 遍历DOM以获得正确的字符串返回,有时

Javascript 遍历DOM以获得正确的字符串返回,有时,javascript,dom,google-chrome-extension,Javascript,Dom,Google Chrome Extension,我正在用一个简单的内容脚本测试chrome扩展开发,该脚本遍历DOM,如果找到给定字符串,则返回true 在简单网页上,脚本100%正确返回,但在更复杂的网页上,例如google搜索结果,在具有给定字符串的网页上,脚本可能每10次返回1次true 我正在使用Crockfords DOM遍历算法,甚至尝试了不同的算法,但结果相同。我不熟悉扩展和Javascript,不确定这是否是某种异步问题 var exists = false; function walkTheDOM(node) {

我正在用一个简单的内容脚本测试chrome扩展开发,该脚本遍历DOM,如果找到给定字符串,则返回true

在简单网页上,脚本100%正确返回,但在更复杂的网页上,例如google搜索结果,在具有给定字符串的网页上,脚本可能每10次返回1次true

我正在使用Crockfords DOM遍历算法,甚至尝试了不同的算法,但结果相同。我不熟悉扩展和Javascript,不确定这是否是某种异步问题

var exists = false;

function walkTheDOM(node) {
    // String search function 
    if (node.nodeType === 3)
        if (node.nodeValue.indexOf("today") > -1) 
            exists = true;

    // Continue recursive DOM traversal
    node = node.firstChild;
    while (node) {
        walkTheDOM(node);
        node = node.nextSibling;
    }
    return exists;
}

if (walkTheDOM(document.body))
    alert("String exists in page.");

由于页面的内容可能是动态的(在代码执行后加载新内容),因此有两种可能:

  • 如果您需要在确定的时间内做出决定,请稍等片刻。设置脚本开始执行时的超时,然后检查

  • 如果您同意在稍后出现一个单词时更改决策,那么最好的办法是运行您已经运行的内容,再加上分析新的/修改的节点


  • 如果您的策略是“尽快检测,在确定的时间内放弃”,则可以将这两种方法结合使用。

    由于页面的内容可能是动态的(在代码执行后加载新内容),因此有两种可能:

  • 如果您需要在确定的时间内做出决定,请稍等片刻。设置脚本开始执行时的超时,然后检查

  • 如果您同意在稍后出现一个单词时更改决策,那么最好的办法是运行您已经运行的内容,再加上分析新的/修改的节点


  • 如果您的策略是“尽快检测,在确定的时间内放弃”,那么您可以将这两种方法结合使用。

    为什么不直接使用document.body.textContent?此外,这将“遍历DOM”到最后,即使在开始时找到文本也是如此。谢谢,我不知道这一点,
    document.body.textContent.indexOf(“string”)
    非常有效。对于我来说,找出为什么我使用的DOM遍历技术返回的结果如此不可靠仍然是一件有趣的事情。你什么时候运行这个检查?有可能页面正在插入动态内容,而您检查得太早了?@Evantimboli还有,一些内容可能是在iFrame中交付的,因此OP的方法无法访问。@Evantimboli据我所知,在加载DOM后,chrome扩展的内容脚本会运行,为什么不使用document.body.textContent?此外,这将“遍历DOM”到最后,即使在开始时找到文本也是如此。谢谢,我不知道这一点,
    document.body.textContent.indexOf(“string”)
    非常有效。对于我来说,找出为什么我使用的DOM遍历技术返回的结果如此不可靠仍然是一件有趣的事情。你什么时候运行这个检查?有可能页面正在插入动态内容,而您检查得太早了?@Evantimboli还有,一些内容可能是在iFrame中交付的,因此OP的方法无法访问。@Evantimboli据我所知,chrome扩展的内容脚本是在加载DOM后运行的