我在表单提交时做了一个验证函数,函数中用jquery的$.post方法去查询了数据库,根据返回情况判断是否能够执行表单的action,
但是缺发现js函数执行时没等$.post查询结果赋值给返回变量就已经执行了最后一句,返回默认返回值了。这就使我的验证出现了误判。经过调式我发现这个问题是js函数在执行时没有等$.post的返回结果就执行了下一句,我有些困惑,这中问题该如何解决,虽然不管能不能提交都在判断中都来个alert()倒是可以解决,但是由于互动友好性不太可取。清剿大虾们有什么好的解决方法,这个查询不想放到action里面做,因为我想让他提交表单前就能得到结果,一边重新选择。
代码如下://当前人员=主联系人 本因能返回true执行表单提交,现在却不等post的结果出来就执行了最后一句return了初始值false,导致判断出错。function checkIsMainContact(){
var tof = false;
var isMainContactObj = document.getElementsByName("staffSqlBean.mainContactSign");
var customerId = document.getElementById("customerId").value;
var beanStaffId = document.getElementById("beanStaffId").value;
var isMain =0;
for(var i=0;i<isMainContactObj.length;i++){
if(isMainContactObj[i].checked){
isMain = isMainContactObj[i].value;
}
}

if(isMain ==0){
//设置主联系人=否
tof = true;
}else{
$.post("isMainContact.action",{customerId:customerId},
 function(data){
var v = eval(data);
if(v.isMainContactSign == 0){
tof = true;
}else{
//存在主联系人
if(v.isMainContactSign == -1){
alert("该客户的主联系人存在异常,暂无法再设置其他主联系人!");
}else{
if(v.staffId == beanStaffId){
tof = true; //当前人员=主联系人
}else{
alert("客户已存在主联系人的情况下无法再设置其他主联系人!");
}
}
}
 }
);
}
return tof;
}

解决方案 »

  1.   

    jquery的ajax和get都能设置async: false
    false是同步,true是异步,或者用ajax手写源码也可以设置
      

  2.   


    function checkIsMainContact(){
            var isMainContactObj = document.getElementsByName("staffSqlBean.mainContactSign");
            var customerId = document.getElementById("customerId").value;
            var beanStaffId = document.getElementById("beanStaffId").value;
            var isMain =0;
            for(var i=0;i<isMainContactObj.length;i++){
                if(isMainContactObj[i].checked){
                    isMain = isMainContactObj[i].value;
                }
            }
            
            if(isMain ==0){
                //设置主联系人=否
                return true;
            }else{
                $.post("isMainContact.action",{customerId:customerId},
                     function(data){
                        var v = eval(data);
                        if(v.isMainContactSign == 0){
                            return true;
                        }else{
                            //存在主联系人
                            if(v.isMainContactSign == -1){
                                alert("该客户的主联系人存在异常,暂无法再设置其他主联系人!");
                                return false;
                            }else{
                                if(v.staffId == beanStaffId){
                                    return true; //当前人员=主联系人
                                }else{
                                    alert("客户已存在主联系人的情况下无法再设置其他主联系人!");
                                    return false;
                                }
                            }
                        }
                     }
                );
            }
        }
      

  3.   

    沙发一句话解决我的问题,我在函数里加了句设置,是可以了!thx
      

  4.   


    3楼的想法跟我一样,但事实上不行的哦,在会进入(//当前人员=主联系人)处的情况下,return的是true; 但结果返回值是false的。同样感谢你的热心解答O(∩_∩)O~
      

  5.   

    lz,我服了,你这样async: false当然可以,但他失去了ajax的意义了阿,
    我那段代码应该是可行的,你再看看把!
      

  6.   


    想想是对的,但结果真的是不对的,我开始的时候也是这样做的,刚才又试了一把还是不对的。我也觉得jquery里不应该有这种问题吧,我以前dwr框架下没遇到这种问题过,同样是异步操作的。这里我没办法了,只好在这个js函数里设置成同步操作了。
      

  7.   

    http://www.17ext.com/ask/q-44195.aspx
    太挫了,昨天提的问题今天这网站就有了,好厉害的爬虫。
      

  8.   


    如果  async: false  失去了ajax的意义 ,那么为什么ajax还要有设置的接口呢?便民养生网   http://www.yangsheng52.com