如何使用内容脚本进行onClicked编程注入?

时间:2015-02-09 12:30:29

标签: javascript google-chrome google-chrome-extension google-chrome-devtools

我创建了一个Google Chrome Action扩展程序。它不需要使用弹出页面。 它有一个后台持久进程/页面,不断分析页面源数据。但是,这是一个单独的过程,我不想像在官方示例中那样从后台进行UI编程注入。

我设计了在用户页面顶部动态生成UI(结果)的脚本,需要在单击“操作”图标时显示。我需要使用内容脚本,而不是后台或弹出页面来执行此程序化注入。

但是它不起作用,因为内容脚本是一个“孤岛”,它不与其他扩展程序通信,并且没有对chrome的完全访问权限。因此,在内容脚本中使用以下代码时:

chrome.extension.sendMessage({}, function(response) {
var readyStateCheckInterval = setInterval(function() {
if (document.readyState === "complete") {
    clearInterval(readyStateCheckInterval);

chrome.browserAction.onClicked.addListener(function(tab) {
 chrome.tabs.executeScript(null, {file: "content_script.js"}); }

这是我的清单文件的一部分:

 "background": {
    "scripts": [
      "src/bg/background.js"
    ],
    "persistent": true
  },
  "page_action": {
    "default_icon": "icons/icon19.png",
    "default_title": "Show my visitors"
  },
  "permissions": [
    "*://*.google.com/*",
    "background"
  ],
  "content_scripts": [
    {
      "matches": [
        "*://*.google.com/*"
      ],
      "js": [
        "src/inject/inject.js"
      ]
    }
  ]

它不起作用,因为内容脚本压缩无法访问browserAction.onClicked方法。我真的需要在单击动作扩展图标时使用内容脚本进行编程注入。有什么建议吗?

1 个答案:

答案 0 :(得分:2)

实际上,chrome.browserAction.onClicked不能驻留在内容脚本中。

必须在后台脚本中监听。这是后台脚本的主要目的:对事件做出反应的统一场所。它非常普遍,以至于Chrome甚至为仅对事件作出反应的背景页面引入了一类特殊的背景页面Event Pages

您需要决定是否采用明确的注射途径或程序注射途径。

如果您通过清单注入代码,您的脚本将始终加载,您可以使用chrome.tabs.sendMessage来触发代码。

如果您决定仅在点击时注入代码,则应该像在代码中那样从侦听器中调用chrome.tabs.executeScript。同样,如果您需要在两个组件之间进行通信,请使用Messaging

再次查看Architecture overview