Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript beforeunload/unload可以用于可靠地发送XmlHttpRequests吗_Javascript_Html_Dom_W3c_Specifications - Fatal编程技术网

Javascript beforeunload/unload可以用于可靠地发送XmlHttpRequests吗

Javascript beforeunload/unload可以用于可靠地发送XmlHttpRequests吗,javascript,html,dom,w3c,specifications,Javascript,Html,Dom,W3c,Specifications,最近,我有一个紧急要求给我的服务器一个通知,我的webapp的一个特定页面即将关闭。我想,在卸载之前已经有相当一段时间了。HTML5“东西”甚至更新了规范(这就是我所想的…),我们可以选择在卸载事件处理程序之前从返回字符串值,这样用户就可以选择拦截 然而,事实证明,到目前为止,还没有任何“官方”规范可供使用,该规范描述了卸载前的行为。我找到的唯一一份官方文件是关于WHATWG的,当然这只是W3C的提案 到目前为止还不错。我们能够在卸载之前在事件处理程序中创建同步的XHR请求。“大多数”浏览器

最近,我有一个紧急要求给我的服务器一个通知,我的webapp的一个特定页面即将关闭。我想,
在卸载之前
已经有相当一段时间了。HTML5“东西”甚至更新了规范(这就是我所想的…),我们可以选择在卸载事件处理程序之前从
返回
字符串值,这样用户就可以选择拦截

然而,事实证明,到目前为止,还没有任何“官方”规范可供使用,该规范描述了卸载前
的行为。我找到的唯一一份官方文件是关于WHATWG的,当然这只是W3C的提案

到目前为止还不错。我们能够在卸载之前在
事件处理程序中创建同步的XHR请求。“大多数”浏览器会给该请求一个大约1-2秒的完成时间,之后它就会被杀死。标准异步请求将立即终止。话虽如此,我甚至无法从“哪里”得知这一点,现在看来这就像是流言蜚语和口碑。即使如此,它在Firefox+Chrome中也能工作,我们不能依赖它,不是吗

卸载前是否有关于
的任何正在进行的讨论/建议?
我可能找不到关于该活动的任何其他官方资源


在这里,对我来说最重要的是,我们通过同步XHR发送数据的可靠性有多高?

需要记住的是,
在卸载之前作为Internet Explorer的扩展启动。自动地,这使它成为网络上的二等公民。没有规范,浏览器实现也各不相同。例如,Firefox仅通过不显示字符串(仅显示一般消息)来部分实现它

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

我的感觉是,你不应该依靠这个信息来拯救你。如果这个web应用是内部的,我建议培训他们使用
保存
关闭
或其他按钮,而不是仅仅关闭选项卡。如果是外部的,可以考虑在用户执行操作时自动保存?

看看,这样即使在卸载页面时,也可以将数据可靠地发送到服务器。它目前在一个浏览器中,由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);
};
进一步阅读:

同步XHR是浏览器挂起的主要来源,占挂起的近10%:


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

我通过YUI3事件处理(这与此问题无关)和XHR使用此事件对服务器进行“触发并忽略”异步调用。(!)XHR调用(对大型内部会计应用程序进行统计记录,以查看应用程序用户的哪些页面实际使用了多长时间——毕竟,只有当他们离开页面时,我才能记录他们在页面上的停留时间)。我在FF(最新版本)上对其进行了测试IE 7和IE 8-有效。回答很好。正如我所说,我甚至不知道它是从哪里来的,我只知道它有效。在一个特定的时间段后,浏览器将取消请求。就像他们忽略模式窗口调用一样。我不知道Hixie这么说,但听起来真的很可怕。当然这样的事件,even如果规范和实施得当,就无法涵盖所有“流星撞击地球”(meteor hits earth)崩溃案例,但对于大多数自动保存或通知案例来说,它可能已经足够好了。也就是说,选项卡/窗口关闭、重定向、浏览器关闭。“没有什么比未指定的功能更糟糕的了”(jAndy,2013)我想知道,既然
XMLHttpRequest
不是唯一的异步方法,那么这种功能是如何可用的?为什么他们不引入一个事件来可靠地处理页面卸载上的异步操作?为什么???注:来自Chrome 59
navigator.sendBeacon
和json(或任何非简单CORS)内容类型将引发异常。显然是暂时的,直到安全问题得到解决。请参阅:由于chrome 73相关的chrome功能,因此不再支持同步ajax。我认为您没有抓住要点。正如我提到的,sync xhr Requirest是在beforeunload处理程序中向服务器发送数据的唯一方法。浏览器将允许ose是一种请求,但他们会在短时间内中止它(这是一件好事)。有趣的问题是,它为什么会这样工作,是谁定义了这种行为+它可靠吗。它是用HTML指定的,从2000年代末就开始了。