我正在编写一个带有弹出窗口和背景页面的 google chrome 扩展程序。弹出窗口订阅了后台生成的某些事件,我想在弹出窗口消失时取消订阅这些事件。但是,我没有看到从弹出窗口生成的 onbeforeunload 或 onunload 事件。这些事件被触发了吗?如果没有,关于如何捕获弹出关闭的任何想法?
4 回答
浏览器操作弹出窗口不会触发“beforeunload” 。相信我,我试过了。但是,应该正确触发“卸载”,因此请注意。
实际上,我有一个类似的系统,它允许您使用 addEventListener 附加事件,并且当 unload 事件触发时它们会自动清理。
这里有一个小提示:显然你不能使用console.log
,因为当 unload 事件触发时,已经太晚了。但是,您可以这样做:
var background = chrome.extension.getBackgroundPage();
addEventListener("unload", function (event) {
background.console.log(event.type);
}, true);
通过使用上面的代码,您可以打开后台页面的控制台,它应该显示 unload 事件已正确触发。
我有一个类似的问题。就我而言,我将焦点设置在弹出页面中的一个元素上。所以当弹出窗口关闭时,元素失去焦点,我可以捕捉到模糊事件。
如果您已切换到在扩展程序中使用事件页面而不是背景页面,则推荐的访问它的方法是调用chrome.runtime.getBackgroundPage()
一个通过背景页面引用回调的函数。
但是,如果您尝试在onbeforeunload
处理程序中获取背景页面,如下所示:
document.addEventListener("beforeunload", function() {
chrome.runtime.getBackgroundPage(function(backgroundPage) {
backgroundPage.log("unloading");
});
});
在页面卸载之前回调似乎没有触发,因此log()
永远不会进行调用。
在上面的评论中,Pauan 建议使用chrome.extension.getBackgroundPage()
来获取页面。我可以让它工作的唯一方法是不使用addEventListener()
. 相反,我不得不去老学校并直接将处理程序设置为window
:
window.onbeforeunload = function() {
chrome.extension.getBackgroundPage().log("unloading");
};
终于到了后台页面。
使用消息传递 API 在弹出页面和背景页面之间设置一个端口。然后,当弹出窗口消失时,您应该在后台页面中获得一个 onDisconnect 事件。
// popup.js
chrome.runtime.connect({ name: "popup" });
// background.js
chrome.runtime.onConnect.addListener(function (port) {
if (port.name === "popup") {
port.onDisconnect.addListener(function () {
console.log("popup has been closed");
});
}
});