用于替换加载到Android开源浏览器的页面主体标记中的文本的JavaScript

用于替换加载到Android开源浏览器的页面主体标记中的文本的JavaScript,javascript,android,browser,replace,evaluate,Javascript,Android,Browser,Replace,Evaluate,我正在为Android可用的开源浏览器编写JavaScript,用一些不同的文本替换加载到浏览器中的页面的body标记中的文本 这一点需要注意,一旦页面加载到浏览器中,就会执行JavaScript并进行替换,最后,带有替换文本的页面在浏览器中可见 这是代码的替换部分: var textnodes, node, i; textnodes = document.evaluate("//body//text()[not(ancestor::script) and not(ancestor::style

我正在为Android可用的开源浏览器编写JavaScript,用一些不同的文本替换加载到浏览器中的页面的body标记中的文本

这一点需要注意,一旦页面加载到浏览器中,就会执行JavaScript并进行替换,最后,带有替换文本的页面在浏览器中可见

这是代码的替换部分:

var textnodes, node, i;
textnodes = document.evaluate("//body//text()[not(ancestor::script) and not(ancestor::style)]",document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null);
replace();
function replace() {
   for (i = 0; i < textnodes.snapshotLength; i++) {
      node = textnodes.snapshotItem(i);
      text = node.data;
      text = text.replace(/\'/g, "♥");
      //The rest of the replacements
      node.data = text;
   }
}
然而,document.evaluate似乎不起作用。有人能帮我纠正这段代码吗?或者有人建议用其他方法来完成替换正文任务吗

谢谢

对不起,你

虽然您可以使用JavaScript XPath实现,但与编写特定的DOM遍历代码相比,这将是一个缓慢而庞大的解决方案

function replaceInTextNodes(parent, needle, replacement) {
    for (var child= parent.firstChild; child!==null; child= child.nextSibling) {
        if (child.nodeType===1) { # Node.ELEMENT_NODE
            var tag= child.tagName.toLowerCase();
            if (tag!=='script' && tag!=='style' && tag!=='textarea')
                replaceInTextNodes(child, needle, replacement);
        }
        else if (child.nodeType===3)
            child.data= child.data.replace(needle, replacement);
    }
}
replaceInTextNodes(document.body, /'/g, '\u2665');

谢谢!我可以在你的帮助下解决替换问题。目前,我正在页面上的event.equalsEventConstants.EVT_WEB_上执行JavaScript。因此,如果页面较大,则需要花费大量时间进行替换,因为它必须等待整个页面加载。我是否有更好的地方来执行此脚本,以便在加载整个页面之前,页面一出现就立即进行替换?谢谢你的帮助!我想,你必须不断地检查间隔计时器。试图跟踪页面上的哪些元素已完全加载,以避免两次在相同的文本节点上重新替换,这将是一件非常痛苦的事情。幸运的是,在这种情况下,重新替换是无害的,因此您可以通过多次运行替换来逃脱。谢谢!我把它设置为一个间隔时间,加载页面时的间隔很长&加载页面时的间隔很短。现在它工作得很好。文本在看到时已被替换。再次感谢你的帮助!