最近,我有迫切要求给我的服务器的通知,我的web应用程序的特定页面即将获得封闭。 我想:“ 易peasy”, beforeunload
是使用了相当长一段时间。 HTML5的“东西”,甚至刷新了规范 (这是我的想法......)这件事,因为我们不得不选择的方式return
从一个字符串值 beforeunload
事件处理程序之类的东西,这给了用户的选项截距。
请参阅有关的MDN页onbeforeunload
然而,事实证明,没有任何“ 官方 ”规范可用,这说明了行为beforeunload
了这个日期。 我发现的唯一的正式文件,是在WHATWG,这仅仅是当然的W3C的建议。
见WHATWG
到现在为止还挺好。 我们能够创建一个内同步XHR请求 beforeunload
事件处理程序。 “大多数”的浏览器,给该请求的约1-2秒的时限内完成,之后它被杀。 标准异步请求立即死亡。 有了这样说,我甚至不能告诉从“里”我知道这一点,好像八卦和口碑,在现在看。 即使寿,它工作在Firefox + Chrome浏览器,我们不能依赖于,对吗?
是否有WHATWG任何正在进行的讨论/建议beforeunload
?
有关事件的我的任何其他官方资源可能还没有发现?
远远最重要的是我在这里,怎么能可靠地通过我们同步XHR有发送数据?
看看navigator.sendBeacon()
它可以让你可靠地发送数据,即使页面卸载服务器。 这是目前在规范草案和火狐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);
};
延伸阅读:
要记住的事情是, beforeunload
开始是由Internet Explorer的扩展。 自动,这使得它在网络上的二等公民。 没有规范,并且浏览器实现不同而不同。 例如,火狐仅部分地通过不显示字符串中,只有一个通用消息实现它。
此外,即使全面实施,它并不能防止所有可能的卸载的情况,例如,用户已经终止了处理器,浏览器崩溃,或计算机已关闭。 即使忽略这些极端情况,我怀疑有可能将浏览器配置为忽略这样的请求。
我的感觉是,你不应该依赖于这个消息来拯救你。 如果该Web应用程序是内部的,我会建议培训他们使用Save
或Close
或任何按钮,而不是直接关闭标签。 如果是外部的,也许考虑自动保存为用户做他们的事情?
同步XHR是浏览器挂起的上源,占了近10%挂起: http://blogs.msdn.com/b/ieinternals/archive/2011/08/03/do-not-use-xmlhttprequest-in -synchronous模式-除非,你样到hang.aspx
在IE浏览器,甚至同步XHR可以被“打断”如果请求要求Windows身份验证往返,或者如果有要发送一个POST体。 您可能会发现只有第一个未经身份验证的请求的头被发送。