如果我离开$ .ajax()请求中间的页面,则会触发错误回调.我已经在Safari和FF中测试了GET和POST请求.
一个可能的解决方案是在页面卸载时中止所有AJAX请求,但是在卸载之前调用错误处理程序,所以这似乎不可能.
我希望能够通过礼貌警报或模态对话框在客户端优雅地处理诸如500s之类的REAL错误,但我不希望在用户离开页面时调用此处理.
我该怎么做呢?
-
(也很奇怪:当离开页面时,错误处理程序说textStatus参数是"错误",与接收500 /错误请求时抛出相同.)
我在LAMP环境中发现了一个奇怪的现象.
在前端,我用jQuery执行一个AJAX post请求,如下所示:
$.post('save.php', {data1: d1, data2: d2, [...], dataN: dN})
Run Code Online (Sandbox Code Playgroud)
的变量d1,以dN从网站(例如,从文字输入,文字区域,复选框等)与jQuery预先收集.
该文件save.php将post参数data1传递给dataN一个查询并将其保存在数据库中.
除非我在请求期间更改页面(例如,通过单击链接),否则请求大约需要500毫秒并且没有问题.
通常情况下,我希望请求被中止和忽略(这很好)但是(这是奇怪的行为)请求似乎已经完成,但只有部分数据被传输并因此被保存.
这意味着,例如,PHP脚本只保存data1到data5并设置data6到dataN空.
这个问题似乎已经被AJAX请求(不是PHP脚本),因为场引起$_POST['data6'],以$_POST['dataN']在PHP中没有设置在这种情况下.
所以我的问题:
为什么会发生这种情况(这是预期的行为)?
我怎么能避免呢?
更新
问题既不是jQuery也不是php.jQuery正确收集值并尝试将它们发布到php.我刚刚验证了它 - 它有效.另一方面,php脚本处理它按预期获得的所有内容 - 它只是没有收到整个请求.
所以问题必然是被中断的请求本身.与我预期它不会中止或失败不同,它仍会传输所有数据直到中断.
然后php获取此帖子数据并开始处理它 - 显然缺少一些信息.
更新2
我加入一个参数固定的问题eof后dataN,并检查它是否是PHP设置.通过这种方式,我可以确保传输了整个请求.
然而,这并不能解决我仍然不理解的问题的根源.
有人帮忙吗?
我做了很多$ .ajax调用,我以一种抛出消息的方式处理它们的错误.我发现如果在页面重新加载时正在进行ajax调用,例如单击刷新,或导航到另一个URL,那么我正在进行的ajax调用会触发它们的错误回调.
如何区分真实错误和因重新加载页面而中止的调用之间的区别?
$.ajax(...)
.success(...)
.error(function(jqXHR) {
// jqXHR.status == 0 means either failed to contact server,
// or aborted due to page reload -- how can I tell the difference?
});
Run Code Online (Sandbox Code Playgroud) 我使用以下代码将数据从服务器异步拉入客户端.错误块中的警报报告服务器上发生的错误.但是,如果用户在呼叫期间离开页面页面,则此块也会被触发并抛出一个空的警报容器.有没有办法处理用户更优雅地离开页面(即不要在他们离开前抛出空警报)?也许通过区分用户已导航的错误块,而不是在服务器上发生错误?
$.ajax({
type: "GET",
url: "/handlers/myHandler.ashx",
async: true,
dataType: "json",
data: "var1=test_val&var2=test_val"
success: function (invoices) {
//Success block
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(errorThrown);
}
});
Run Code Online (Sandbox Code Playgroud)