我有一个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事件的侦听器的对象。
并非所有人都乐于助人;)
我正在做什么,或者当我能检测到弹出窗口关闭时有什么不对吗?
答案 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对象的引用。如果垃圾收集器收集它,端口将被断开。
最后,端口名称是可选的;如果它是您使用的唯一端口,则可以删除设置/检查名称的代码。