[英]Chrome extension popup close fired at wrong time
我有一个chrome扩展程序,该扩展程序当前由一个背景页面和一个弹出页面组成。 打开弹出窗口时会发生一些初始化。 我正在使用DOM事件
doc.addEventListener('DOMContentLoaded', function() { ... }
并且行为是正确的。 问题是关闭弹出窗口时。 由于chrome弹出窗口不会引发unload
事件,因此我使用此处建议的内容。 这是我的代码
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
事件的文档是
一个对象,允许添加和删除Chrome事件的侦听器。
并不是每个都有帮助;)
那么,我在做任何错误的事情,还是可以检测到弹出窗口关闭的任何方式?
除非弹出窗口中有人监听chrome.runtime.onConnect
(根据您的评论,似乎并非如此), chrome.runtime.connect()
将返回一个立即关闭的Port(因为没人愿意听) 。
但是,与使用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对象的引用。 如果垃圾收集器对其进行收集,则端口将断开连接。
最后,端口名称是可选的。 如果这是您使用的唯一端口,则可以删除设置/检查名称的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.