在后台页面中是否有等同于`run_at:start`的内容?

时间:2016-08-04 15:09:48

标签: javascript google-chrome-extension

我需要在正在加载的页面上执行任何其他代码之前运行一些JavaScript代码。

使用像这样的内容脚本可以正常工作:

{
  "matches": ["http://*/*", "https://*/*", "file://*/*"],
  "js": ["contentScript.js"],
  "run_at": "document_start"
}

但现在我只想在用户通过点击浏览器操作按钮选择的某些页面上运行内容脚本。

我已尝试收听chrome.tabs.onUpdated然后调用executeScript,但其他代码正在我的内容脚本之前的页面上运行。

有没有办法确保后台页面注入的代码在其他代码之前运行?

我还可以在我的内容脚本中添加一个条件,但这意味着我需要访问当前tabId以及激活我的扩展程序的所有标签的列表。

1 个答案:

答案 0 :(得分:2)

根据文档chrome.tabs.executeScript有几个有用的参数,包括runAt(默认情况下它是document_idle,它发生在DOMContentLoaded事件之后),所以要尽快注入脚本使用runAt: 'document_start'

chrome.tabs.executeScript(tabId, {
    runAt: 'document_start',
    code: 'console.log(document.documentElement.innerHTML);',
});

请注意,在此阶段,DOM树通常为空,特别是如果您从早期执行的事件侦听器(例如tabs.onUpdated或webNavigation.onCommitted)注入。即使HEAD或BODY元素可能仍然不存在,因此您必须使用(document.head || document.documentElement)后备作为<style><script>等任何已添加节点的容器。