2010-08-02 63 views
14

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

+1

请记住,浏览器还有其他方式可以退出,包括关机和崩溃。即使有100%可靠的方法来检查浏览器正常退出,您仍然有漏洞。 – 2012-09-20 06:59:50

回答

9

Chrome扩展API中没有这样的事件。

但是,每当窗口关闭时都会触发chrome.windows.onRemoved事件。我想你可以检查这个事件,如果你关闭了最后一个窗口,但不幸的是,由于Chrome的异步性质,这是行不通的。

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

做出最终答案为:不,目前您不能,据我所知。您可能想要在http://crbug.com/30885上发布以下错误报告以获得关于更新的注意事项。

+0

感谢您的回应,事实上我决定以旧派的方式,只需保存localstorage中的以前的订阅信息,并在后台脚本重新加载时取消订阅=) – simple 2010-08-02 19:58:45

0

添加浏览器关闭事件是一个相当频繁的请求。明星http://crbug.com/30885的更新。并阅读错误报告,以便通过按键检测浏览器何时关机。

4

如果您在打开的选项卡数为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当一个标签被删除,并运行你的浏览器closeclose事件处理程序如果num_tabs = 0
chrome.tabs.onRemoved.addListener(function(tabId){ 
    num_tabs--; 
    console.log("Tab removed event caught. Open tabs #: " + num_tabs); 
    if(num_tabs == 0) 
     notification.cancel(); 
}); 
+0

这是否甚至给chrome的异步性质,因为codingbug的答案说? – 2011-12-10 22:52:46

+0

如果你的浏览器有一个扩展名,它具有“背景”权限,请参阅这个 - > https://developer.chrome.com/extensions/declare_permissions,即使你认为它已经存在,chrome也不会退出。你必须明确地终止这个过程,或者强迫退出等等。 – ankitG 2016-04-13 09:15:22

3

这一次为我的作品:

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

这需要chrome.windows而非chrome.tabs

+2

您可以拥有多个Chrome窗口,每次关闭某个窗口时都会触发此窗口,而不仅仅是最后一个窗口关闭。 – s3m3n 2013-11-06 16:54:39

1

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

正如之前提到的,我们通常无法处理类似onBrowserClose事件并阻止浏览器关闭。但是在某些情况下,我们可以使用window.onunload事件同步,并且如果它确实同步,它也可以使用。

从我的经验,你至少可以:

  • 保存在(例如日志)的HTML5 localStorage(这是同步)的一些信息。
  • 调用一些异步铬扩展API函数,但不能得到结果。 (它适用于我!!)
  • 执行同步 XMLHTTPRequest(是的,有时它的工作原理)。