onbeforeunload事件是否会在google chrome扩展程序中触发popup.html?

时间:2010-02-23 03:06:32

标签: google-chrome google-chrome-extension onbeforeunload

我正在编写带有弹出窗口和背景页面的Google Chrome扩展程序。弹出窗口订阅了后台生成的某些事件,我想在弹出窗口消失时取消订阅这些事件。但是,我没有看到从弹出窗口生成onbeforeunload或onunload事件。这些事件被解雇了吗?如果没有,关于如何捕捉弹出窗口的任何想法都关闭?

3 个答案:

答案 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");
};

终于进入了背景页面。