单击Chrome扩展程序后,为什么会出现错误?

时间:2020-10-01 09:38:30

标签: javascript api google-chrome-extension

我正在尝试创建一个简单的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,因此我对为什么它不起作用感到困惑。

1 个答案:

答案 0 :(得分:1)

内容脚本仅在第一次在标签页中加载页面时运行,因此在chrome:// extensions页面上安装或重新加载扩展程序时,还需要重新加载标签页或reinject the script explicitly。另外,默认情况下,内容脚本在DOMContentLoaded之后运行,因此如果页面仍在加载中,它可能仍在等待注入(您可以告诉它在document_start上运行)。

请注意,在您的用例中,可能不需要自动注入的内容脚本,因此可以删除content_scripts部分,从<all_urls>中删除permissions,然后切换到{{ 3}},即使没有消息传递也可以传递数据。