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

Fra*_*Bob 29 javascript google-chrome-extension content-script

我的扩展应该加载一个内容脚本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 Code Online (Sandbox Code Playgroud)

Bro*_*ams 47

"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.
}
Run Code Online (Sandbox Code Playgroud)


在您关心的脚本需要一段时间才能完成的情况下,您将不得不根据具体情况轮询某些条件.例如:

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.
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 它确实有这样的条件,否则你不能说`searchTopic.js`加载得太早了.什么,*确切*你想要做什么,以及你在控制台上得到什么错误消息,如果有的话.......你是什么意思"答案#1和2"?这个问题的答案之一被其海报删除了.它没有解决你的问题. (2认同)
  • @HaveAGuess,是的,它们(通常)会起作用,但在实践中它们经常变得棘手。一个更简单的计时器每次都能工作,更强大且更便携。 (2认同)
  • 计时器建议+1。在尝试了突变观察者方法之后,我可以证明它变得很棘手。 (2认同)

Aar*_*lla 5

script元素按顺序执行。如果script.body​ 这保证可以工作,否则document.write()将停止工作。

所以你有两个解决方案:

  1. 使用该onload事件加载您的代码。
  2. 添加脚本标签作为页面的最后一个元素(body元素中的最后一个元素)。该脚本将在所有其他脚本完成正文转换为 DOM 树后执行。

  • 脚本元素可以是[延迟或异步](http://peter.sh/experiments/asynchronous-and-deferred-javascript-execution-explained/)。或者可以动态加载脚本。或者可以加载脚本,但包含/链接的代码需要一些时间才能完成初始化。 (3认同)
  • `window.onload` 等待 `async`/`defer` 脚本加载和执行,因此这比在页面底部添加脚本效果更好。(请参阅 [W3C 的 HTML API](http://www.w3.org/TR/2008/WD-html5-20080610/tabular.html) 上的“‘外部脚本的下载必须延迟加载事件。’” .) 等待异步脚本*行为*(Ajax、`setTimeout`、事件)的一般问题仍然存在,但这不能以一般方式解决。 (2认同)