【问题标题】:Event onBrowserClose for Google Chrome Extension?Google Chrome 扩展的 onBrowserClose 事件?
【发布时间】:2011-03-24 08:36:45
【问题描述】:

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

【问题讨论】:

  • 请记住,浏览器还有其他退出方式,包括关机和崩溃。即使有 100% 可靠的方法来检查浏览器是否正常退出,您仍然会有漏洞。

标签: javascript google-chrome google-chrome-extension


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢回复,确实我决定走老派的路,只需将之前的订阅信息保存在本地存储中,并在后台脚本重新加载时取消订阅 =)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    如果您在打开的标签页数为 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 的异步特性,这项工作是否有效?
    • 如果你的浏览器有一个扩展,它有“背景”的权限,参考这个 --> developer.chrome.com/extensions/declare_permissions,即使你认为它有,chrome也不会退出。你必须明确终止进程或强制退出或其他东西。
    • 这个解决方案实际上是答案,但是,最后一次触发 tabs.onRemoved 中的 http 请求不会运行,猜猜为什么,任何人?
    【解决方案4】:

    这个对我有用:

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

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

    【讨论】:

    • 您可以拥有多个 Chrome 窗口,并且每次关闭某个窗口时都会触发此功能,而不仅仅是在最后一个窗口关闭时。
    • 这行不通! chrome 在触发最后一个事件 windows.onRemoved 之前退出
    【解决方案5】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-27
      • 2013-11-30
      • 2017-03-20
      • 2012-01-12
      相关资源
      最近更新 更多