21

最近,我迫切需要通知我的服务器,我的 webapp 的特定页面即将关闭。“容易的peasy ”我想,beforeunload可以使用相当长的一段时间。HTML5“东西”甚至刷新了关于它的规范(这就是我的想法......),就像我们可以选择来自事件处理程序和东西return字符串值beforeunload一样,这让用户可以选择拦截。

请参阅 MDN 页面关于onbeforeunload

然而,事实证明,没有任何“官方”规范可用,它描述了beforeunload迄今为止的行为。我找到的唯一官方文档是关于WHATWG的,当然这只是对 W3C 的提议。

见 WHATWG

到现在为止还挺好。我们能够在事件处理程序中创建同步的 XHR 请求。beforeunload“大多数”浏览器会给该请求大约 1-2 秒的时间来完成,之后它就会被杀死。标准异步请求立即被终止。话虽如此,我什至无法分辨我从“哪里”知道这一点,现在看起来像是八卦和口耳相传。即便如此,它也可以在 Firefox+Chrome 中运行,我们不能依赖它,可以吗?

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

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

4

3 回答 3

20

看一下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);
};

进一步阅读:

于 2013-03-18T14:48:25.843 回答
4

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

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

我的感觉是你不应该依赖这个消息来拯救你。如果这个网络应用程序是内部的,我建议培训他们使用SaveClose或其他按钮,而不是仅仅关闭选项卡。如果它是外部的,也许在用户做他们的事情时考虑自动保存?

于 2013-03-18T14:40:16.447 回答
2

Sync XHR 是浏览器挂起的主要来源,占挂起的近 10%:http: //blogs.msdn.com/b/ieinternals/archive/2011/08/03/do-not-use-xmlhttprequest-in -同步模式,除非你喜欢挂起.aspx

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

于 2013-03-18T15:44:51.953 回答