0

我创建了Google Chrome浏览器操作扩展。它不需要使用弹出页面。 它有一个持续分析页面源数据的后台持久化进程/页面。但是,这是一个单独的过程,我不想在后台执行UI编程注入,就像官方的例子。如何使用内容脚本进行onClicked程序化注入?

我设计了在用户页面顶部动态生成UI(结果)的脚本,当点击Action图标时需要显示该脚本。我需要使用内容脚本来完成这个程序化注入,而不是后台或弹出页面。

但它不起作用,因为内容脚本是一个'孤岛',不能与其他扩展进行通信,并且没有对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" 
     ] 
    } 
    ] 

它不起作用,因为内容脚本pressumably没有访问browserAction.onClicked方法。当使用内容脚本单击动作扩展图标时,我确实需要进行编程式注入。有什么建议么?

回答

2

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

它必须在后台脚本中被监听。这是后台脚本的主要目的:对事件做出反应的统一地点。 Chrome浏览器甚至为后台页面引入了一类特殊的后台页面,这些页面仅对事件做出反应,因此非常流行。

您需要决定是否显示注入路线或程序注入路线。

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

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

再看一眼Architecture overview

+0

谢谢@Xan。我将使用消息传递接口从后台侦听器向内容脚本发送通知,无论何时单击图标以激活注入的脚本。 – 2015-02-09 15:08:50

+0

请考虑其含义:如果内容脚本始终被注入但很少被激活,这意味着您总是使用一些资源,例如匹配的每个选项卡的内存。如果内容脚本不做别的事情,那么切换到PI可能是值得的。 – Xan 2015-02-09 15:11:21

+0

当然,正如我在我的文章中指出的那样,程序注入是我需要的方式。自动注入内容脚本的清单文件仅供参考。谢谢 – 2015-02-09 16:03:26

相关问题