问题:用Ajax写了测试代码如下:
一个文本框,一个按钮,Click事件绑定到下面方法上:
function postNote(){
var data=$('#content').serialize();
$.ajax({
type:"post", url:"noteCreate.do", dateType:"json", data:data,
error: function(XmlHttpRequest, textStatus, errorThrown){
alert(XmlHttpRequest.status);
alert("提交失败!请联系管理员。")
},
success: function(data,textStatus){
alert(textStatus);
alert("提交成功!");
}
});
服务器端代码无误,这里就不写了。测试发现问题,我在Tomcat启动时,打开页面,然后关闭Tomcat。点击按钮,结果在IE上正确调用error的处理方法,但是在Firefox和Chrome上均调用succuss方法处理。用Firebug观察返回结果,发现已经没有响应内容了,但依然调用success。
$.ajax上我加了cache:"false"和async:"false",依然无效。设置Timeout:"2000"后可以正常,但我觉得不能通过设置Timeout来解决该问题。
求正解。
这是1.4.2及以下版本的处理bug。 1.4.3已经修复
[url]http://bugs.jquery.com/ticket/6060[/url]
如果需要在1.4.2下用可以加patch
[url]http://bugs.jquery.com/attachment/ticket/6060/0001-Fix-jQuery.ajax-success-function-being-called-when-H.patch[/url]
或者使用如下两种方式解决
1、修改success
success: function(data,textStatus, jqXHR){
if (jqXHR.readyState === 4 && jqXHR.status === 0) {
alert("提交失败!请联系管理员。");
}else {
alert("提交成功!");
}
}
2、设置timeout
[code="java"]http://stackoverflow.com/questions/3616823/jquery-ajax-error-handler-doesnt-work[/code]
alert("提交失败!请联系管理员。") 少了个分号
奇怪,我用你的代码测试了一下,tomcat关闭后chrome、ie、firefox执行的都是error方法啊。。。
error中貌似少了this。
error:function (XMLHttpRequest, textStatus, errorThrown) {
// 通常 textStatus 和 errorThrown 之中
// 只有一个会包含信息
this; // 调用本次AJAX请求时传递的options参数
}
我觉得你换成这个会好一点
complete:function(xMLHttpRequest,textStatus){
var st=xMLHttpRequest.status;
if(st!=200){
//判断
}
this;
}
$(function(){
$('#NoteSubmit').bind('click',function(event){
postNote();
});
});
这些不要了,直接在button里绑定postNote方法,比如: