Does onbeforeunload event trigger for popup.html in a google chrome extension?

别说谁变了你拦得住时间么 提交于 2019-11-26 16:10:47

问题


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.



来源:https://stackoverflow.com/questions/2315863/does-onbeforeunload-event-trigger-for-popup-html-in-a-google-chrome-extension

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!