【问题标题】:Opening a message port between background and content_script for a chrome extension在背景和 content_script 之间为 chrome 扩展打开消息端口
【发布时间】:2016-09-26 01:34:27
【问题描述】:

我正在开发一个 Chrome 扩展程序,该扩展程序涉及通过消息端口后台脚本内容脚本的消息传递。根据documentation,我必须首先查询我要连接的内容脚本正在运行的选项卡,然后使用该选项卡的 ID 打开一个端口。所以我的后台脚本和内容脚本如下所示:

background.js

chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
    var port = chrome.tabs.connect(tabs[0].id, { name: "example" });
    port.postMessage("hello world");
});

content_script.js

chrome.runtime.onConnect.addListener(function(port) {
    port.onMessage.addListener(function(msg) {
        console.log(msg);
    });
});

并且没有消息打印到控制台。我首先通过在 content_script port.onMessage.addListener(function(msg) { 的这一行上放置断点进行了一些调试,这从未被击中。这让我相信这个端口从未在 background.js 中打开过。所以接下来,我通过使用此处访问的开发工具在 var port = chrome.tabs.connect(tabs[0].id, { name: "example" }); 这一行的 background.js 中设置了一个断点

事实证明,我的查询实际上并没有将任何选项卡返回到回调中,因此tabs[0].id 会引发错误。我猜一旦我让这个选项卡查询工作,消息传递就会开始工作,所以有没有人知道这里发生了什么我无法查询当前的活动选项卡?我已经在许多其他 StackOverflow 响应中看到了这个确切的查询,它在 message passing docs 的一个示例中。

【问题讨论】:

    标签: javascript google-chrome-extension google-chrome-devtools message-passing


    【解决方案1】:

    请确保当前活动选项卡允许注入内容脚本,我的意思是,当您在后台页面调用chrome.tabs.query 时,活动选项卡页面不是chrome://extensions 页面。这通常在您重新加载扩展程序时发生,在这种情况下,在您调用 chrome.tabs.query({active: true, currentWindow: true}) 后,您将获得带有 chrome://extensions url 的选项卡,而此页面默认不允许注入内容脚本。

    为避免这种情况,您可以调整您的消息传递方式:

    1. 你可以starting the message passing from content scripts
    2. 您还可以添加一些其他触发点来启动消息传递。例如,当点击 browserAction 时调用chrome.tabs.query

    【讨论】:

    • 我的解决方案是启动从内容脚本传递的消息。谢谢!我仍然有点好奇为什么反过来做是行不通的,如果不能这样做,为什么 Chrome 的文档有一个这样做的例子。
    • @azrosen92,我并不是说从后台页面开始时它不起作用。只是时间不合适,查询结果是chrome://extensions页面,不能注入内容脚本。您可以尝试第二种方法,添加特定的触发点。
    • 在我的情况下,问题是我正在测试我的扩展程序,并且我必须与之通信的选项卡不会收到任何内容,除非我在重新加载扩展程序后重新加载它们。重新加载扩展时,现有选项卡的内容脚本不会自动刷新。 P.S.:This answer 解释的很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多