我的扩展应该加载一个内容脚本searchTopic.js,只有在它注入的页面已经完全加载后(是的,我在扩展清单中将“run_at”设置为“document_end”),但实际上它是在创建所有DOM对象之前加载的(关键的是通过页面中的一些Javascript创建的)。所以,问题是,我怎么能等到页面的Javascript执行完毕?这是我的清单:
"content_scripts": [
{
"run_at": "document_end",
"matches": ["https://groups.google.com/forum/*"],
"js": ["searchTopic.js"]
}
],
答案 0 :(得分:43)
"run_at": "document_end"
is the equivalent to 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.
}
}
}
答案 1 :(得分:2)
script
个元素按顺序执行。如果script
中有body
个节点,浏览器甚至会停止加载DOM内容。这保证可以正常工作,否则document.write()
将停止工作。
所以你有两个解决方案:
onload
事件加载您的代码。body
元素中的最后一个元素)。在将主体转换为DOM树之后,所有其他脚本完成和后,将执行此脚本。答案 2 :(得分:0)
您使用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);