Google chrome 从扩展到后台页面的消息传递

Google chrome 从扩展到后台页面的消息传递,google-chrome,google-chrome-extension,chromium,message-passing,Google Chrome,Google Chrome Extension,Chromium,Message Passing,我正在尝试在chrome中创建页面操作扩展。我有一个html页面,对应于单击页面操作时显示的弹出窗口。我在这个html页面中包含了一个脚本文件popup.js。在这个页面中,我试图向后台js文件background.js发送一条消息。问题是我从popup.js只调用了一次sendRequest,但我在后台页面多次收到它。我正在那里执行一个文件操作,由于并发访问导致脚本错误。我正在粘贴与消息传递相关的代码 扩展名文件-popup.js chrome.extension.sendRequest({"

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

扩展名文件-popup.js

chrome.extension.sendRequest({"intent" : "read"}, function (message) {
      console.log(message);
});
(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);
})();
背景页面-background.js

chrome.extension.sendRequest({"intent" : "read"}, function (message) {
      console.log(message);
});
(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次,它会出现一个错误,说
无法发送响应:每个chrome.extension.onRequest侦听器每个文档不能发送一次以上的响应(消息由扩展名kaejpmlibijbgbgcfodphlkcjjkmjlk发送)。
有人能帮我吗?

它们应该只工作一次


您可以使用长寿命消息传递系统,也可以在从内容脚本接收消息时反复重新连接相同的处理程序。

使用chrome.extension.getBackgroundPage()。您将可以从弹出窗口访问背景页面。 或者写入本地存储并使用侦听器

window.addEventListener('storage', function (e) {}, false);
如果使用chrome.extension.sendRequest在popup和background.html之间进行通信,则会出现内存泄漏问题