Google Chrome 扩展程序的 onBrowserClose 事件?

IT技术 javascript google-chrome google-chrome-extension
2021-02-26 19:05:07

我正在为 Google Chrome 开发一个扩展程序。我的后台脚本每次都在使用 XMPP API 的服务器上授权,并订阅 PubSub 节点。我需要在退出时取消订阅,否则虚拟订阅将保留在服务器上。onBrowserCloseGoogle Chrome 扩展 API 中是否有任何事件?

5个回答

Chrome 扩展 API 中没有此类事件。

然而chrome.windows.onRemoved,每次窗口关闭时都会触发一个事件。我想如果你关闭最后一个窗口,你可以检查这个事件,但不幸的是,由于 Chrome 的异步特性,这不起作用。

我尝试在onRemoved事件处理程序中运行一个简单的 AJAX 请求AJAX 请求从未到达服务器,因为 Chrome 在运行事件之前已经关闭(或者只是忽略它)。

最后的答案是:不,目前你不能,据我所知。您可能希望在http://crbug.com/30885 上以下错误报告加星标,以便在更新时引起注意。

感谢您的回复,确实我决定采用老式的方式,只需将之前的订阅信息保存在 localstorage 中,并在重新加载后台脚本时取消订阅 =)
2021-04-25 19:05:07

如果您发现打开的标签页数为 0 的情况,您可以将其视为 Chrome onClose 事件。就我而言,我必须在 Chrome 关闭之前取消桌面通知,否则它会崩溃。我是这样做的:

1. 使用以下命令初始化变量 num_tabs:
chrome.tabs.getAllInWindow( null, function( tabs ){
    console.log("Initial tab count: " + tabs.length);
    num_tabs = tabs.length;
});
2. 创建选项卡时增加 num_tabs:
chrome.tabs.onCreated.addListener(function(tab){
    num_tabs++;
    console.log("Tab created event caught. Open tabs #: " + num_tabs);
});
3. 删除选项卡时减少 num_tabs 并在 num_tabs = 0 时运行浏览器 onclose 事件处理程序
chrome.tabs.onRemoved.addListener(function(tabId){
    num_tabs--;
    console.log("Tab removed event caught. Open tabs #: " + num_tabs);
    if( num_tabs == 0 )
        notification.cancel();
});
正如codingbug 的回答所说,即使考虑到 chrome 的异步性质,这是否也有效?
2021-05-01 19:05:07
如果您的浏览器有一个扩展程序,该扩展程序具有“背景”权限,请参阅此 --> developer.chrome.com/extensions/declare_permissions,即使您认为它已经退出,chrome 也不会退出。您必须明确终止进程或强制退出或其他什么。
2021-05-01 19:05:07
这个解决方案实际上就是答案,但是,最后一次触发 tabs.onRemoved 中的 http 请求不会运行,猜猜为什么,有人吗?
2021-05-14 19:05:07

添加浏览器关闭事件是一个非常频繁的请求。http://crbug.com/30885更新。并阅读错误报告,了解一个聪明的黑客来检测浏览器何时通过按键关闭。

这个对我有用:

chrome.windows.onRemoved.addListener(function(windowId){
  alert("!! Exiting the Browser !!");
});

它需要chrome.windows而不是chrome.tabs

您可以有多个 Chrome 窗口,并且每次关闭某个窗口时都会触发,而不仅仅是在最后一个窗口关闭时触发。
2021-04-23 19:05:07
这不起作用!chrome 在触发最后一个事件 windows.onRemoved 之前退出
2021-04-25 19:05:07

TL;DR:尝试window.onunload事件,它适用于某些情况。

正如之前提到的,我们通常无法处理诸如onBrowserClose事件之类的事情并阻止浏览器关闭。但对于一些情况下,我们可以使用window.onunload事件做一些同步,并且它的工作是否真的同步

根据我的经验,您至少可以:

  • 在 HTML5 localStorage同步)中保存一些信息(例如日志)。
  • 调用一些异步chrome扩展API函数却得不到结果。(它对我有用!耶!)
  • 执行同步XMLHTTPRequest(是的,有时它有效)。