Chrome扩展弹出窗口在错误的时间关闭

时间:2016-03-06 08:21:24

标签: javascript google-chrome google-chrome-extension

我有一个chrome扩展程序,目前包含一个后台页面和一个弹出页面。打开弹出窗口时会发生一些初始化。我正在使用DOM事件

doc.addEventListener('DOMContentLoaded', function() { ... }

行为是正确的。 问题是关闭弹出窗口时。由于chrome popup不会抛出unload事件,因此我使用的是here。这是我的代码

popup.js

bgPage = chrome.extension.getBackgroundPage();
bgPageManager = bgPage.manager(); // This is the exposed api from bg page
bgPageManager.init(chrome.runtime.connect({
    name: 'P1'
}));

此处连接到运行时并将端口发送到后台页面,以便它可以收听onDisconnect事件。

Background.js

function init(port) {
    port.onDisconnect.addListener(function() {
        // Clean up happens here
        stateManager.unregister();
    });
}

这也有效。

但问题是,这个onDisconnect 会在弹出窗口被打开时被触发,而不是在它关闭时被触发

onDisconnect事件的documentation

  

允许添加和删除Chrome事件的侦听器的对象。

并非所有人都乐于助人;)

我正在做什么,或者当我能检测到弹出窗口关闭时有什么不对吗?

1 个答案:

答案 0 :(得分:1)

除非弹出页面中有chrome.runtime.onConnect的内容(从您的评论中看似不是这样),chrome.runtime.connect()将返回一个立即关闭的端口(因为没有人愿意听)。

尽管如此,你肯定会比参与getBackgroundPage更困难。弹出窗口可以启动端口本身。您所需要做的就是:

// popup code
var bgPort = chrome.runtime.connect({name: "P1"});

// background code
var popupPort;
chrome.runtime.onConnect.addListener(function(port) {
  if(port.name == "P1") {
    popupPort = port;
    popupPort.onDisconnect.addListener(function() {
      /* Clean up happens here */
    });
  }
});

如果你想保留你已有的东西,放入弹出窗口的最小代码是:

var bgPort;
chrome.runtime.onConnect.addListener(function(port) {
  if(port.name == "P1") {
    bgPort = port;
  }
});

请注意,在所有情况下,您都需要在两侧保留对Port对象的引用。如果垃圾收集器收集它,端口将被断开。

最后,端口名称是可选的;如果它是您使用的唯一端口,则可以删除设置/检查名称的代码。