浏览器关闭不会触发 safari 上的可见性变化

ope*_*per 5 javascript safari jquery visibilitychange

我试图在用户关闭浏览器时保存一些统计信息,下面是代码

    if (typeof document.hidden !== 'undefined') { // Opera 12.10 and Firefox 18 and later support
      hidden = 'hidden';
      visibilityChange = 'visibilitychange';
    } else if (typeof document.mozHidden !== 'undefined') {
      hidden = 'mozHidden';
      visibilityChange = 'mozvisibilitychange';
    } else if (typeof document.msHidden !== "undefined") {
      hidden = 'msHidden';
      visibilityChange = 'msvisibilitychange';
    } else if (typeof document.webkitHidden !== 'undefined') {
      hidden = 'webkitHidden';
      visibilityChange = 'webkitvisibilitychange';
    } else {
      console.log('in else condition');
    }

if (typeof document.addEventListener === 'undefined' || hidden === undefined) {
      console.log("App requires a browser, such as Google Chrome or Firefox, that supports the Page Visibility API.");
    } else {
      document.addEventListener(visibilityChange, handleVisibilityChange, false);
    }

 function handleVisibilityChange() {
// Send a ajax call with **async: false**
}

Run Code Online (Sandbox Code Playgroud)

上面的代码在 mozilla firefox、google chrome 中运行良好,但在 safari 中不起作用。我正在 Mac Os 上测试这个,safari 版本是Version 12.1.1 (14607.2.6.1.1)

任何人都可以建议这是否是 safari 中的预期行为,以及可以做些什么作为解决方法。

谢谢。

小智 0

根据 MDN 文档,“pagehide”事件应该适用于此:

如果您专门尝试检测页面卸载事件,则 pagehide 事件是最佳选择。

https://developer.mozilla.org/en-US/docs/Web/API/Window/pagehide_event

  • 此外,您还可以使用 navigator.sendBeacon 而不是 AJAX 调用以获得更好的性能。https://developer.mozilla.org/en-US/docs/Web/API/Document/visibilitychange_event#sending_end-of-session_analytics_on_transitioning_to_hidden (2认同)