【发布时间】:2016-04-08 18:29:22
【问题描述】:
我正在使用here 描述的方法作为替换文本的基础来制作一个文本替换扩展名。
这是重要的一段代码
var elements = document.getElementsByTagName('*');
for (var i = 0; i < elements.length; i++) {
var element = elements[i];
for (var j = 0; j < element.childNodes.length; j++) {
var node = element.childNodes[j];
if (node.nodeType === 3) {
var text = node.nodeValue;
var replacedText = text.replace(/[word or phrase to replace here]/gi, '[new word or phrase]');
if (replacedText !== text) {
element.replaceChild(document.createTextNode(replacedText), node);
}
}
}
}
现在这在 99% 的情况下都可以正常工作,但在某些计算机上(我假设基于计算机的速度和缓存的内容)此代码在某些网站上不起作用,最重要的是在 google 搜索上。该脚本肯定会运行,但它没有找到任何可替换的东西。我最好的猜测是它在完成加载并将所有来自 google 的数据添加到 DOM 之前正在加载和运行脚本。
我有两个问题
1) 有什么方法可以检测到谷歌在运行脚本之前已经完成了它需要做的事情吗?或者这本质上是不可能的,因为(我假设)发生了一些异步的事情。
2) 如果我无法检测到其完全加载完成,那么检测文本或图像元素已添加到 DOM(或在 DOM 上编辑)的最佳方法是什么,以便我可以重新运行该函数替换文本?
提前感谢您的帮助。
【问题讨论】:
-
使用异步数据创建dom没有简单的方法。您可以使用间隔计时器来继续检查特定元素,并在这些元素存在时运行您的代码
-
你的异步代码到底在哪里?你能告诉我们吗?通常你可以使用回调或承诺来处理异步函数调用。
-
@marcel OP 正在创建浏览器扩展,因此代码位于 OP 无法控制的其他页面上
-
这不是我的异步代码,它的谷歌(如果我的猜测是正确的)
-
@master565 如果数据是动态加载的,你应该尝试在数据被渲染后使用回调来触发你的javascript
标签: javascript jquery google-chrome google-chrome-extension google-chrome-app