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

时间:2013-03-18 14:22:03

标签: javascript html dom w3c specifications

最近,我迫切需要向我的服务器发出通知,我的webapp的特定页面即将关闭。 “简单易玩”我想,beforeunload可以使用很长一段时间。 HTML5“事物”甚至刷新了关于它的规范(这就是我的想法......),就像我们可以选择return一个字符串值< / em>来自beforeunload事件处理程序和东西,它为用户提供拦截选项。

See the MDN page about onbeforeunload

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

See WHATWG

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

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

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

3 个答案:

答案 0 :(得分:18)

查看navigator.sendBeacon(),它允许您即使在页面卸载时也能可靠地将数据发送到服务器。它目前处于draft specification状态,并得到Firefox 31,Chrome 39(37后旗帜)的支持,落后于Opera 24的旗帜。

你可以&#34;有点&#34;使用以下内容进行polyfill:

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);
};

进一步阅读:

答案 1 :(得分:3)

要记住的是beforeunload作为Internet Explorer的扩展而开始。自动地,这使它成为网络上的二等公民。没有规范,浏览器实现也各不相同。例如,Firefox只是通过不显示字符串来部分实现它,只显示通用消息。

此外,即使完全实现,它也不能防止所有可能的卸载情况,例如,用户已终止处理器,浏览器已崩溃或计算机已关闭。即使忽略这些极端情况,我怀疑可能会将浏览器配置为忽略此类请求。

我的感觉是你不应该依赖这条信息来拯救你。如果此网络应用是内置的,我建议您对其进行培训,以使用SaveClose或其他按钮,而不是仅关闭标签。如果它是外部的,可以考虑自动保存,因为用户做了他们的事情?

答案 2 :(得分:1)

同步XHR是浏览器挂起的主要来源,占挂起的近10%:http://blogs.msdn.com/b/ieinternals/archive/2011/08/03/do-not-use-xmlhttprequest-in-synchronous-mode-unless-you-like-to-hang.aspx

在IE中,如果请求需要Windows身份验证往返,或者如果要发送POST正文,则甚至可以“中断”同步XHR。您可能会发现只发送第一个未经身份验证的请求的标头。