起因:
业务需求:在提交表单校验过程中,先通过ajax异步请求一下,判断提交的记录是否数据库已经拥有,有就不给校验通过,没有就让它添加。很简单一个逻辑。
ajax代码
$.ajax({
type : "POST", //提交方式
url : "mobile/bankcard/confirm.do",//路径
data : {
password: password
},
success : function(result) {//返回数据根据结果进行相应的处理
result=eval('('+result+')'); //单个数据才需要使用
if ( result ) {
console.log(result);
} else {
console.log(result);
}
},
error : function(error){
console.log(error);
}
});
坑点一
想通过返回的结果直接在ajax 的if else里面直接return,或者赋值给全局变量。结果发现不可行。因为在ajax中是无法给js中的全局变量赋值的,因为ajax默认是异步请求(当要赋值时,此时的值没有拿到,所以赋值不成功)
- 解决方案一:增加同步属性设置
async: false
, 设置为同步请求
$.ajax({
type : "POST", //提交方式
url : "mobile/bankcard/confirm.do",//路径
data : {
password: password
},
async: false,
success : function(result) {//返回数据根据结果进行相应的处理
result=eval('('+result+')'); //单个数据才需要使用
if ( result ) {
console.log(result);
} else {
console.log(result);
}
},
error : function(error){
console.log(error);
}
});
解决方案二:使用隐藏的input标签来记录值。
目测如果ajax后接下来的操作马上要获取这个值也是不行的,毕竟ajax执行也要时间,可以用在ajax无关的业务处理里面。
function test(){
var result=0;
$.ajax({
type: "POST",
url: "ajax/checkfor1.php?action=reg_checkEmail",
data: {email:email},
dataType: 'text',
success: function(data){
$('#datastore').append('<div data='+data+'></div>');//使用一个div标签,定义一个自定义属性data来存储数据
},
error: function() {
alert("异常!");
}
});
}
坑点二
好不容易解决前面的同步问题,突然发现这里ajax一直抛错。
后来断定:后台程序必定有bug,我这次是发现后台抛异常了,没有返回值就ajax报错了。
ajax几个常见的错误情况:
- data不能不写
data为空也一定要传”{}”;不然返回的是xml格式的。并提示parsererror. data:”{}” - URL路径问题
路径不能有中文 - dataType错误
类型错误:后台返回的dataType类型和前台写的不一致会跳入error
格式错误:jquery1.4之后对json的格式要求非常严格,json格式错误也会跳入error.{“test”:1} 注意格式
有时,在不需要返回值的情况下,扔按模板格式,设置了dataType:”json”,参数;这时候,ajax传值正确时,出现200返回成功状态下报错的特殊情况。
使用jquery的方法去掉字符串前后空格
虽然在服务器端加trim()方法也可以去掉前后空格,但是前端能做的事情没必要增加服务器压力。
$.trim(xxx);
,不解释。