又到了临近期末之际,这学期学的javaWeb也要开始做期末项目了。我(们)做的是一个类似于网上零售的商城系统。其中我有用到ajax的异步请求方式,而在我码代码的过程中,发现了一个很奇怪的现象:ajax提交给后台的请求有执行成功,但是当执行了之后却不去执行success回调而执行error回调,先上代码:
function deleteCar(carID) {
if (confirm("确认要删除?")) {
$.ajax({
url:"servlet/DeleteCarServlet",
data:{
"carID":carID
},
type:"GET",
dataType:"json",
success:function(data){
if(data=="SUCCESS"){
$("#productID_"+carID).hide();
alert(data+"删除成功");
return;
}
else{
alert("操作失败");
return;
}
},
error:function(){
alert("error");
}
});
}
}
在这里调用该函数:
<td class="delete"><button οnclick="deleteCar(<%=car.getCarID()%>);">删除</button></td>
而当我调试的时候,却出现了这种情况,没有执行success,去执行了error
而在后台,可以看到确实已经执行了我的业务逻辑代码:
我就意识到可能哪一个环节出问题了,但后台逻辑代码没错的话就肯定是前端有问题,而且肯定就是这个ajax请求或是调用的那一行有错。
我又去网上搜索了些关于何时调用success和errord的问题,总结如下:
Ajax请求通过XMLHttpRequest对象发送请求,该对象有四个状态(readyState):
0-未初始化、1-正在初始化、2-发送数据、3-正在发送数据、4-完成。
当XMLHttpRequest.readyState为4时,表示ajax请求已经完成可以得到响应结果。
ajax的success和error方法根据响应状态码来触发。当XMLHttpRequest.status为200的时候,表示响应成功,此时触发success().其他状态码则触发error()。
除了根据响应状态码外,ajax还会在下列情况下走error方法:
1. 返回数据类型不是JSON
2. 网络中断
3. 后台响应中断 点击打开链接
可以知道,竟然后台的代码都执行了,那状态码肯定是已经经过了这4个的,所以问题不在这
我继续看代码,这里确实没有问题啊,难道是前端的那一行调用的代码出错?我索性将<button>换成<a> 看看行不行,
<a οnclick="deleteCar(<%=car.getCarID()%>);">删除</a>
一调试,还真的可以!!!
而为什么<a>标签可以<button> 不行呢?我在网上找到了这个答案:
既然用了Ajax就不应该用OnClick事件。
1、点击Button按钮,先执行OnClientClick客户端脚本,return true时进行页面回发。
2、使用Ajax异步请求,回调函数接收数据之前,页面已经回发了。原来的页面已经不存在,上哪接收异步请求返回的结果。
其实这个并不是我的这个的答案,不过也可以参考。
而且我发现,当dataType知名为“json”而返回的又不是json时,肯定会出错,所以若返回的类型不是json,这一个属性可以不填。