【问题标题】:Android Chrome window.onunloadAndroid Chrome 窗口.onunload
【发布时间】:2024-05-29 13:10:02
【问题描述】:

我正在开发一个 HTML5 应用程序专门用于 Android 和 Chrome。我遇到的问题源于跟踪打开的浏览器选项卡的要求。我通过创建存储在每个选项卡的 sessionStorage 中的唯一 ID 来做到这一点。然后,我通过在每个选项卡都可以访问的 localStorage 数组中注册每个 ID 来跟踪打开的选项卡。

问题是我无法在使用 window.onunload 事件关闭选项卡时从 localStorage 中删除 ID。该代码在桌面 Chrome 中运行良好,但我无法在 Android 中运行。

$(window).on('beforeunload', function () {
    removeWindowGUID(); 
});

function removeWindowGUID() {
    var guid = sessionStorage.getItem("WindowGUID");
    var tmp = JSON.parse(localStorage.getItem("WindowGUIDs"));
    tmp = tmp.remove(guid);  // remove is a custom prototype fn
    localStorage.setItem("WindowGUIDs", JSON.stringify(tmp));
}

重新加载页面时会触发此事件,这很好,只是不会在关闭时触发。 我也尝试过使用 pagehide 事件。

【问题讨论】:

    标签: javascript android jquery google-chrome local-storage


    【解决方案1】:

    取决于浏览器。有些使用.onunload,有些使用onbeforeunload

    最快的解决方案是

    window.onunload = window.onbeforeunload = function() {
        var guid = sessionStorage.getItem("WindowGUID");
        var tmp = JSON.parse(localStorage.getItem("WindowGUIDs"));
        tmp = tmp.remove(guid);  // remove is a custom prototype fn
        localStorage.setItem("WindowGUIDs", JSON.stringify(tmp));
    });
    

    使用原生安卓浏览器在姜饼、ICS 和果冻豆上进行测试。

    【讨论】:

    • 如前所述,它仅适用于桌面,不适用于移动 chrome。当我关闭标签时,好像 onunload 和 onbeforeunload 或 onpagehide 永远不会触发。
    • 我也遇到了同样的问题 - 有什么解决方案或解决方法吗?只有移动设备不会触发该事件。
    • 不管怎样,将两个事件绑定到同一个函数对我来说很有效。在运行 Android 4.4.2(Chrome 浏览器)的三星 Galaxy Tab 3 上测试。
    • @OscuroAA 绝对。 Chrome 对它有更好的支持。大多数情况下,这是不支持其中一个或另一个的浏览器的后备解决方案。这样做应该确保桌面浏览器正确执行onunload()事件。
    • 我很难理解为什么将两个事件绑定到一个函数可以解决两个事件都不会被触发的问题。我在 Android 上的 Chrome 上没有收到任何事件。此外,他们做不同的事情 - onbeforeunload 提供取消卸载的机会(取决于是否支持)。你不会想在两个函数中做同样的事情,或者两次。
    【解决方案2】:

    我做了类似的事情,错误完全相同。我注意到如果以编程方式调用 window.close() ,则会调用该事件。我刚刚在页面上添加了自己的“关闭”按钮。

    【讨论】:

    • 再看看How to Answer。如果有办法调试问题,那么在您的答案中查看该代码会很有帮助