我有一个场景,我需要在离开一个页面时提出一个跨域请求。端点配置了所有正确的CORS头。
这是请求:
$.ajax({
type: "POST",
url: URL,
data: {
// some stuff
},
async: false
});如果按原样进行测试,效果会很好。当我试图从unload处理程序触发此请求时:
$(window).unload(function() {
// same as above
});intermittently失败了。当它失败时,我得到这个堆栈跟踪:
Error: A network error occurred.
at Object.x.ajaxTransport.x.support.cors.e.crossDomain.send (http://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js:6:9344)
at Function.x.extend.ajax (http://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js:6:4804)
at http://my.web.site.com/main.js:129:11
at x.event.dispatch (http://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js:5:10006)
at x.event.add.y.handle (http://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js:5:6789)使用jQuery DOMException和错误代码19。
这里发生了什么事?这里似乎存在一些我不知道的争用条件,但除了将请求设置为同步之外,我不知道还能做什么。
发布于 2013-12-14 22:49:28
最后,我使用了beforeunload事件:
$(window).on('beforeunload' function() {
// same code
});在所有现代浏览器上都能很好的工作。beforeunload事件行为是一致的,只要请求是同步发送的,事件执行--从而暂停窗口卸载--就会暂停。
这正是Gmail、Facebook甚至Stack Overflow等事件服务用于确认用户是否真正有兴趣在操作过程中离开页面的原因。
发布于 2013-12-05 10:30:22
您根本不能依赖卸载处理程序。可能是jQuery的实现或本机onbeforeunload。(在卸载之前,可能会比jQuery的实现工作得更好)
用户可以通过多种方式离开页面(崩溃、ALT+F4、close选项卡、.)。
大多数浏览器只是等待的时间不够长,所以异步请求在大多数情况下都会失败。
你应该重新考虑你的设计。
https://stackoverflow.com/questions/20397244
复制相似问题