我正在编写带有弹出窗口和背景页面的Google Chrome扩展程序。弹出窗口订阅了后台生成的某些事件,我想在弹出窗口消失时取消订阅这些事件。但是,我没有看到从弹出窗口生成onbeforeunload或onunload事件。这些事件被解雇了吗?如果没有,关于如何捕捉弹出窗口的任何想法都关闭?
答案 0 :(得分:31)
“beforeunload”是而不是。相信我,我试过了。然而,“卸载”应该正确解雇,所以请听。
实际上,我有一个类似的系统,它允许你使用addEventListener附加事件,并在unload事件触发时自动清理它们。
这里有一点提示:显然你不能使用console.log
,因为当卸载事件发生时,它已经太晚了。但是,你可以这样做:
var background = chrome.extension.getBackgroundPage();
addEventListener("unload", function (event) {
background.console.log(event.type);
}, true);
通过使用上面的代码,您可以打开后台页面的控制台,它应该显示正确触发了unload事件。
答案 1 :(得分:1)
我遇到过类似的问题。 在我的例子中,我将焦点放在弹出页面中的元素上。 因此,当弹出窗口关闭时,元素会失去焦点,我可以捕捉模糊事件。
答案 2 :(得分:0)
如果你已经在扩展程序中使用event pages而不是后台页面,那么推荐访问它的方法就是使用后台页面引用回调的函数调用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");
};
终于进入了背景页面。