Does onbeforeunload event trigger for popup.html i

2019-01-17 07:43发布

问题:

I'm writing a google chrome extension with a popup and a background page. The popup subscribes to certain events that the background generates, and I would like to unsubscribe from those events when the popup goes away. However, I don't see either of onbeforeunload or onunload events being generated from the popup. Are these events fired? If not, any ideas on how to capture popup close?

回答1:

"beforeunload" is not fired for browser action popups. Believe me, I tried. "unload" should be fired correctly, however, so listen for that.

Actually, I have a similar system in place, that allows you to attach events using addEventListener, and they are automagically cleaned up when the unload event fires.

Here's a little tip: obviously you can't use console.log, because by the time the unload event fires, it's already too late. But, you can do this:

var background = chrome.extension.getBackgroundPage();

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

By using the above code, you can open up the background page's console, which should show that the unload event is fired correctly.



回答2:

I've had a kind of similar issue. In my case, I've set the focus on an element which was in the popup page. So when the popup is closed, the element lose the focus and I can catch the blur event.



回答3:

If you've switched to using event pages instead of background pages in your extension, the recommended way of getting access to it is calling chrome.runtime.getBackgroundPage() with a function that gets called back with the background page reference.

However, if you try to get the background page in an onbeforeunload handler, like this:

document.addEventListener("beforeunload", function() {
    chrome.runtime.getBackgroundPage(function(backgroundPage) {
        backgroundPage.log("unloading");
    });
});

The callback doesn't seem to fire before the page unloads, so that log() call is never made.

In a comment above, Pauan suggested using chrome.extension.getBackgroundPage() to get the page. The only way I could get that to work was not to create the handler with addEventListener(). Instead I had to go old school and set the handler directly on window:

window.onbeforeunload = function() {
    chrome.extension.getBackgroundPage().log("unloading");
};

That finally got through to the background page.