18

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

4

4 回答 4

34

浏览器操作弹出窗口不会触发“beforeunload” 。相信我,我试过了。但是,应该正确触发“卸载”,因此请注意。

实际上,我有一个类似的系统,它允许您使用 addEventListener 附加事件,并且当 unload 事件触发时它们会自动清理。

这里有一个小提示:显然你不能使用console.log,因为当 unload 事件触发时,已经太晚了。但是,您可以这样做:

var background = chrome.extension.getBackgroundPage();

addEventListener("unload", function (event) {
    background.console.log(event.type);
}, true);

通过使用上面的代码,您可以打开后台页面的控制台,它应该显示 unload 事件已正确触发。

于 2010-10-01T15:53:14.563 回答
1

我有一个类似的问题。就我而言,我将焦点设置在弹出页面中的一个元素上。所以当弹出窗口关闭时,元素失去焦点,我可以捕捉到模糊事件。

于 2010-04-18T16:36:57.770 回答
0

如果您已切换到在扩展程序中使用事件页面而不是背景页面,则推荐的访问它的方法是调用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");
};

终于到了后台页面。

于 2017-11-09T02:55:10.683 回答
0

使用消息传递 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");
    });
  }
});
于 2022-02-03T09:10:28.997 回答