我正在开发一个简单的扩展,根据浏览器中的某些用户操作,将消息发送到弹出脚本,然后弹出脚本调用后台脚本中的函数。我是开发Chrome扩展程序的新手,所以请耐心等待。
目前,我有一个设置,可以使用内容脚本检测浏览器中的用户操作,向弹出脚本发送消息,并在检测到的背景页面中调用函数(或者我相信,我还没有得到)警报或日志显示在background.js)的任何地方。
我的问题是:为什么从后台脚本发送时没有检测到消息,并且我的后台脚本中的函数是否被调用?
的manifest.json
{
...
"browser_action": {
"default_icon": "gamify.png",
"default_popup": "user_stats.html"
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["jquery.min.js", "contentscript.js"],
"run_at": "document_end"
}
],
"background": {
"scripts": ["background.js"],
"persistent": false
},
"permissions": [
"storage"
]
}
contentscript.js
$(document).ready(function() {
$("#page-container").click(function() {
chrome.runtime.sendMessage({
action: "Load"
});
});
});
//弹出脚本
$(document).ready(function() {
var bg = chrome.extension.getBackgroundPage();
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
var action = request.action;
if (action == "Load") {
bg.initialize();
}
});
});
background.js
function initialize() {
chrome.runtime.sendMessage({
action: "Start"
});
chrome.storage.sync.get("initialized", function(data) {
alert("BS: Get initialized: " data);
//Do stuff here
});
}
答案 0 :(得分:0)
你为什么要以迂回的方式这样做?
弹出页面只有在显示时才存在;如果弹出窗口未打开,则没有任何内容会收听您的消息并且会丢失。由于它非常脆弱,因此它不适合用于消息路由。
因此,步骤1:从弹出窗口中删除消息路由。在意识形态上,后台页面“始终存在”,并处理大多数操作。您可以通过监听chrome.storage.onChanged
或仅对弹出窗口有意义的不同消息来控制弹出窗口的显示。
但是,您还声明背景页面有"persistent" : false
,即它是Event page。这意味着它总是总是。
顺便说一下,如果页面被卸载,这会导致chrome.extension.getBackgroundPage
不时失败。
您有两种选择:
删除"persistent": false
。事件页面更难处理,所以如果你是新手,你可能想跳过它。
仔细阅读活动页面文档。它列出了您必须处理的限制。