我创建了一个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方法。我真的需要在单击动作扩展图标时使用内容脚本进行编程注入。有什么建议吗?
答案 0 :(得分:2)
实际上,chrome.browserAction.onClicked
不能驻留在内容脚本中。
必须在后台脚本中监听。这是后台脚本的主要目的:对事件做出反应的统一场所。它非常普遍,以至于Chrome甚至为仅对事件作出反应的背景页面引入了一类特殊的背景页面Event Pages。
您需要决定是否采用明确的注射途径或程序注射途径。
如果您通过清单注入代码,您的脚本将始终加载,您可以使用chrome.tabs.sendMessage
来触发代码。
如果您决定仅在点击时注入代码,则应该像在代码中那样从侦听器中调用chrome.tabs.executeScript
。同样,如果您需要在两个组件之间进行通信,请使用Messaging。