我正在尝试创建一个简单的chrome扩展程序。我能够加载该扩展程序,但是当我单击地址栏旁边的扩展程序图标时,出现错误:Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.
为什么?
我的 manifest.json 文件:
{
"name" : "Test",
"version" : "0.1",
"permissions" : ["<all_urls>", "tabs", "activeTab"],
"content_scripts" : [
{
"matches" : ["<all_urls>"],
"js" : ["content.js"]
}
],
"background" : {
"scripts" : ["background.js"]
},
"browser_action" : {
"default_popup" : "popup.html"
},
"manifest_version" : 2
}
popup.html:
<html>
<head>
<link rel="stylesheet" href="popup.css">
<script src="popup.js"></script>
</head>
<body>
<button>Click</button>
</body>
</html>
popup.js
chrome.tabs.query({active : true, currentWindow : true}, (tabs)=>{
chrome.tabs.sendMessage(tabs[0].id, {action : "button_click"}, response =>{
console.log(response);
})
});
content.js
chrome.runtime.onMessage.addListener((request, sender, sendResponse)=>{
if(request.action === "button_click"){
console.log("You clicked the button");
sendResponse("success");
}
})
popup.js 工作正常,因为它正在记录响应,但是 content.js 返回undefined
响应。 background.js 仍然为空,因此我将其排除在外。
这是我第一次接触chrome API,因此我对为什么它不起作用感到困惑。
答案 0 :(得分:1)
内容脚本仅在第一次在标签页中加载页面时运行,因此在chrome:// extensions页面上安装或重新加载扩展程序时,还需要重新加载标签页或reinject the script explicitly。另外,默认情况下,内容脚本在DOMContentLoaded之后运行,因此如果页面仍在加载中,它可能仍在等待注入(您可以告诉它在document_start上运行)。
请注意,在您的用例中,可能不需要自动注入的内容脚本,因此可以删除content_scripts
部分,从<all_urls>
中删除permissions
,然后切换到{{ 3}},即使没有消息传递也可以传递数据。