从内容到背景的消息似乎只在后面的背景动作至少运行一次后才开始触发。
在下面的代码示例中,单击browserAction会将页面变为红色,单击页面正文会将页面变为蓝色(通过内容脚本发送的消息)。
如果我先点击页面正文,则没有任何反应。它只在之后才开始工作我点击了browserAction一次。
为什么会发生这种情况?如何在不首先运行browserAction的情况下触发消息监听器?
非常感谢任何帮助!
content.js
$(function(){
$('body').on('click', function() {
// Send a message to background.js
chrome.runtime.sendMessage(true, function(response){
console.log(response);
});
});
});
background.js
// Make background red when browserAction is cliked
chrome.browserAction.onClicked.addListener(function(){
chrome.tabs.executeScript( {
code: 'document.body.style.backgroundColor="red"'
});
});
// Make background blue when any message is received
chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse){
chrome.tabs.executeScript( {
code: 'document.body.style.backgroundColor="blue"'
});
return true;
})
答案 0 :(得分:1)
在这种情况下一如既往地使用the debugger。我在扩展程序的后台页面控制台中看到的错误可以在chrome:// extensions页面上打开:
运行tabs.executeScript时未经检查的runtime.lastError:无法访问url" ..."的内容。扩展清单必须请求访问此主机的权限。
在内容脚本发送消息后执行runtime.onMessage
时,Chrome不知道executeScript
是由用户操作启动的,因此代码被阻止。
至于browserAction.onClicked
,它总是在用户的交互中调用,因此"permissions": ["activeTab"]
足以用于在发布的点击的eventjob上下文中执行的代码。并创建了修改活动标签的临时权限,请参阅the documentation:
以下用户手势启用activeTab:
- 执行浏览器操作
- 执行页面操作
- 执行上下文菜单项
- 从命令API
执行键盘快捷键- 接受多功能框API的建议
解决方案#1 (最好的)是避免从后台脚本中注入任何代码,并根据后台脚本中的消息在内容脚本中执行所有操作。
解决方案#2 将为manifest.json添加所需的权限:
"permissions": ["activeTab", "<all_urls>"]