我的扩展应该加载内容脚本,searchTopic.js,只有它的注入已经完全载入网页后(是的,我已经设置“run_at”在扩展清单“document_end”),但实际上它是在装货前已创建的所有的DOM对象(关键是那些在页面中通过一些JavaScript创建)。 所以,问题是,我怎么能等到页面的JavaScript执行了? 这里是我的清单:
"content_scripts": [
{
"run_at": "document_end",
"matches": ["https://groups.google.com/forum/*"],
"js": ["searchTopic.js"]
}
],
"run_at": "document_end"
是等同于DOMContentLoaded
。 也就是说, 静态的HTML被加载后触发,但在此之前缓慢的图像和缓慢整理的JavaScript。
所以你不能设置内容脚本页面的JS火后,仅仅通过单独设置清单。 您必须在内容脚本本身对这个代码。
对于内容的脚本, "run_at": "document_end"
将在之前进行发射onload
事件(不同于默认document_idle
-可在不可预测的时间开火)。
所以,第一步是要等待load
,像这样在你的内容的脚本(代码事件searchTopic.js
):
window.addEventListener ("load", myMain, false);
function myMain (evt) {
// DO YOUR STUFF HERE.
}
在你关心的脚本需要一段时间才能完成的情况下,你将不得不轮询根据具体情况逐案一些条件。 例如:
window.addEventListener ("load", myMain, false);
function myMain (evt) {
var jsInitChecktimer = setInterval (checkForJS_Finish, 111);
function checkForJS_Finish () {
if ( typeof SOME_GLOBAL_VAR != "undefined"
|| document.querySelector ("SOME_INDICATOR_NODE_css_SELECTOR")
) {
clearInterval (jsInitChecktimer);
// DO YOUR STUFF HERE.
}
}
}
script
元素以顺序执行。 浏览器甚至停止,如果有DOM内容加载script
中的节点body
。 这是保证工作,否则document.write()
将停止工作。
所以,你有两种解决方案:
- 使用
onload
事件加载你的代码。 - 添加脚本标记的页面(在最后一件事的最后一个元素
body
元素)。 所有其它脚本已经完成之后,该脚本会被执行,并且身体已经转换为DOM树后。
您可以使用window.load方法。
function addLoadEvent(a) {
var b = window.onload;
"function" != typeof window.onload ? window.onload = a : window.onload = function () {
b && b(),
a()
}
}
function init() {
alert('init');
}
addLoadEvent(init);
文章来源: How to get a content script to load AFTER a page's Javascript has executed?