可以使用beforeunload/unload可靠地发送XmlHttpRequests

jAn*_*ndy 19 html javascript w3c dom specifications

最近,我迫切要求给我的服务器一个通知,我的webapp的特定页面即将关闭.我认为," 易玩 " beforeunload很长一段时间.HTML5的"东西",甚至刷新了规范(这是我的想法......)这件事,因为我们有选择的方式return一个字符串值beforeunload事件处理程序之类的东西,这给了用户拦截的选项.

请参阅MDN页面 onbeforeunload

然而,事实证明,没有任何" 官方 "规范可用,它描述了beforeunload截至此日期的行为.我发现的唯一官方文件是WHATWG,当然这只是W3C的提案.

见WHATWG

到现在为止还挺好.我们能够在事件处理程序中创建同步的XHR请求beforeunload."大多数"浏览器为该请求提供大约1-2秒的完成时间,之后它就会被杀死.标准异步请求立即被终止.话虽如此,我甚至无法从"知道这个"的地方说出来,现在看起来像八卦和口口相传.即便如此,它在Firefox + Chrome中运行,我们不能依赖它,可以吗?

关于WHATWG有没有正在进行的讨论/提案beforeunload
关于我可能没有找到的事件的任何其他官方资源?

对我来说最重要的是,我们在那里通过sync-XHR发送数据有多可靠?

And*_*y E 18

看一下navigator.sendBeacon(),即使页面正在卸载,也可以让您可靠地将数据发送到服务器.它目前处于草案规范中,并得到Firefox 31,Chrome 39(37后面的旗帜)的支持,落后于Opera 24的旗帜.

您可以使用以下内容对其进行"排序"填充:

navigator.sendBeacon = navigator.sendBeacon || function (url, data) {
    var xhr = new XMLHttpRequest();

    // Need to send synchronously to have the best chance of data getting
    // through to the server
    xhr.open('POST', url, false);
    xhr.send(data);
};
Run Code Online (Sandbox Code Playgroud)

进一步阅读:

  • "*没有什么比一个未指定的功能更糟糕了" - (jAndy,2013) (2认同)