我的扩展程序应该仅在其注入(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不同-它可以在不可预测的时间触发)。

因此,第一步是等待内容脚本(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.
        }
    }
}

关于javascript - 如何获取内容脚本以在页面的Javascript执行后加载?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13917047/

10-10 18:03
查看更多