我的扩展应该仅在其注入(inject)的页面已完全加载后加载内容脚本 searchTopic.js(是的,我已在扩展 list 中将“run_at”设置为“document_end”),但事实上它在所有 DOM 对象创建之前加载(关键的对象是通过页面中的一些 Javascript 创建的)。那么,问题是,如何才能等到页面的 Javascript 执行完毕?这是我的 list :
"content_scripts": [
{
"run_at": "document_end",
"matches": ["https://groups.google.com/forum/*"],
"js": ["searchTopic.js"]
}
],
最佳答案
"run_at": "document_end"
is the equivalent to DOMContentLoaded
.也就是说,它在加载静态 HTML 之后、但在缓慢图像和缓慢完成 JavaScript 之前触发。
因此,您不能仅通过单独设置 list 来设置在页面 JS 之后触发的内容脚本。您必须在内容脚本本身中为此编写代码。
对于内容脚本,"run_at": "document_end"
将在 onload
事件之前触发(与默认的 document_idle
不同 - 它可以在不可预测的时间发生火灾)。
因此,第一步是在内容脚本 (searchTopic.js
) 中使用如下代码等待 load
事件:
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.
}
}
}
关于javascript - 如何在页面的 Javascript 执行后加载内容脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13917047/