首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在卸载窗口时Ajax请求失败

问在卸载窗口时Ajax请求失败
EN

Stack Overflow用户
提问于 2013-12-05 10:17:56
回答 2查看 1.2K关注 0票数 0

我有一个场景,我需要在离开一个页面时提出一个跨域请求。端点配置了所有正确的CORS头。

这是请求:

代码语言:javascript
复制
$.ajax({
    type: "POST",
    url: URL,
    data: {
        // some stuff
    },
    async: false
});

如果按原样进行测试,效果会很好。当我试图从unload处理程序触发此请求时:

代码语言:javascript
复制
$(window).unload(function() {
    // same as above
});

intermittently失败了。当它失败时,我得到这个堆栈跟踪:

代码语言:javascript
复制
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。

这里发生了什么事?这里似乎存在一些我不知道的争用条件,但除了将请求设置为同步之外,我不知道还能做什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-14 22:49:28

最后,我使用了beforeunload事件:

代码语言:javascript
复制
$(window).on('beforeunload' function() {
    // same code
});

在所有现代浏览器上都能很好的工作。beforeunload事件行为是一致的,只要请求是同步发送的,事件执行--从而暂停窗口卸载--就会暂停。

这正是Gmail、Facebook甚至Stack Overflow等事件服务用于确认用户是否真正有兴趣在操作过程中离开页面的原因。

票数 0
EN

Stack Overflow用户

发布于 2013-12-05 10:30:22

您根本不能依赖卸载处理程序。可能是jQuery的实现或本机onbeforeunload。(在卸载之前,可能会比jQuery的实现工作得更好)

用户可以通过多种方式离开页面(崩溃、ALT+F4、close选项卡、.)。

大多数浏览器只是等待的时间不够长,所以异步请求在大多数情况下都会失败。

你应该重新考虑你的设计。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20397244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档