javascript - 如何在页面的 Javascript 执行后加载内容脚本?

标签 javascript google-chrome-extension content-script

我的扩展应该仅在其注入(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/

相关文章:

javascript - jQuery拖放颜色div来改变另一个背景

javascript - react native : _this2. setState不是一个函数

javascript - 在 Google Chrome 扩展上,从内容脚本到弹出窗口的点击事件不起作用

jquery - 在谷歌浏览器扩展的内容脚本中访问cookie

javascript - 在 chrome 扩展中,如何使用内容脚本注入(inject) Vue 页面

javascript - 如何在 Chrome 扩展内容脚本中使用 google api?

javascript - 单击按钮时设置 JCrop 的宽高比?

javascript - 所有 $watch 执行后的 AngularJS Controller 事件

javascript - Chrome 扩展程序 : Get the text of a web page from given url

chrome 插件中的 Javascript 有语法错误