【问题标题】:Message passing from extension to background page从扩展程序传递到后台页面的消息
【发布时间】:2012-05-18 11:32:16
【问题描述】:

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

扩展文件 - 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). 有人可以帮我解决这个问题吗?

【问题讨论】:

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


    【解决方案1】:

    它们应该只工作一次。

    您可以使用长期存在的消息传递系统,也可以在从内容脚本接收到消息后一遍又一遍地重新附加相同的处理程序。

    【讨论】:

      【解决方案2】:

      使用 chrome.extension.getBackgroundPage()。您将可以从您的弹出窗口访问背景页面。 或者写入 localStorage 并使用监听器。

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

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

      【讨论】:

        猜你喜欢
        • 2013-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多