消息从扩展名传递到后台页面

时间:2012-05-18 11:32:17

标签: google-chrome google-chrome-extension chromium message-passing

我正在尝试在chrome中创建页面操作扩展。我有一个与弹出窗口相对应的html页面,在单击页面操作时显示该页面。我在这个html页面中包含了一个脚本文件popup.js。在这个页面中,我正在尝试将消息发送到后台js文件background.js。问题是我只从sendRequest拨打popup.js一次,但我在后台页面多次收到它。我正在那里执行文件操作,由于并发访问而导致脚本错误。我正在粘贴与此处传递消息相关的代码

扩展程序文件 - popup.js

chrome.extension.sendRequest({"intent" : "read"}, function (message) {
      console.log(message);
});

背景页面 - background.js

(function(){
var fileName = "credentials.txt";
var fileSystem;

function checkUrl(tabId, changeInfo, tab) {
    if(/https?:\/\/.*?\/olc/.test(tab.url)) {
        chrome.pageAction.show(tabId);
        chrome.extension.onRequest.addListener(function (request, sender, callback) {
            callback("printed");
        });
    }
}
chrome.tabs.onUpdated.addListener(checkUrl);
})();

在这种情况下,监听器被调用4次。回调将在第一次调用。接下来的3次出现错误Could not send response: Cannot send a response more than once per chrome.extension.onRequest listener per document (message was sent by extension kaejjpmlibijbgbgcfodphlkcjjkmjlk).任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

他们应该只工作一次。

您可以使用长期存在的邮件系统,也可以在收到内容脚本中的邮件时反复重新连接相同的处理程序。

答案 1 :(得分:0)

使用chrome.extension.getBackgroundPage()。您可以从yor popup访问后台页面。 或者写入localStorage并使用监听器。

window.addEventListener('storage', function (e) {}, false);

如果您使用chrome.extension.sendRequest在popup和background.html之间进行通信,则会遇到内存泄漏问题。