javascript - 如何使用内容脚本进行 onClicked 编程注入(inject)?

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

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

我设计了一个在用户页面顶部动态生成 UI(结果)的脚本,该脚本需要在单击“操作”图标时出现。我需要使用内容脚本(而不是背景页面或弹出页面)来进行编程注入(inject)。

但它不会工作,因为内容脚本是一个“孤独的岛屿”,它不与其他扩展程序通信,并且没有对 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"}); }

这是我的 list 文件的一部分:

 "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 方法。单击操作扩展图标时,我确实需要通过使用内容脚本进行编程注入(inject)。有什么建议吗?

最佳答案

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

必须在后台脚本中监听。这就是后台脚本的主要目的:对事件使用react的统一场所。它是如此普遍,以至于 Chrome 甚至引入了一类特殊的背景页面,Event Pages ,对于仅对事件使用react的后台页面。

您需要决定是采用明显注入(inject)途径还是程序化注入(inject)途径。

如果您通过 list 注入(inject)代码,您的脚本将始终被加载,并且您可以使用 chrome.tabs.sendMessage 触发其中的代码。

如果您决定仅在单击时注入(inject)代码,则应从监听器中调用 chrome.tabs.executeScript,就像在代码中所做的那样。同样,如果您需要在两个组件之间进行通信,请使用 Messaging .

再看看 Architecture overview当你在做的时候。

关于javascript - 如何使用内容脚本进行 onClicked 编程注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28409881/

相关文章:

macos - 如何在 webkit OSX 中禁用回滚?

javascript - 扩展中的 Firestore API key

google-chrome-extension - 从 Google Chrome(内容)扩展程序写入 Google 表格

javascript - 使用带有 obj 的数组索引来删除项目或更改 obj 内的标志

javascript - 如何使用 css、javascript 和 html 制作旋转的 bg 图像?

javascript - 如果我刷新几次,为什么我的应用程序会在 Chrome 中崩溃?

java - 为什么 Google Chrome 不打印表格和单元格边框以及单元格背景颜色?

java - 从 javascript 调用的 applet 方法中的 return 语句

javascript - 从嵌套对象分配变量

javascript - 是否可以在两个单独的页面上运行两个内容脚本?