<form action="1.jsp">
<input type="text" id="tel" flag="0"/>
    <input type="text" id="email" flag="0"/>
    <input type="submit" value="提交" />
</form>
<script>
$('#tel,#email').blur(function(){
var _this=this;
$.ajax({
type:'POST',
url:'',
//async:false,
dataType:'text',
//data:'',
success:function(data){
if(data==true){
$(_this).attr('flag',1)
}
}
});    
});

$('form').submit(function(){
var isSubmit=true;
var input=$('input:text');
for(var i=0; i<input.length;i++){
input.eq(i).blur(); //点击提交 重新做一次验证
if(input.eq(i).attr('flag')==0){
isSubmit=false;
}
}
alert(isSubmit);
return isSubmit;
});
</script>
代码如上,点击“提交”,所有输入框做一次ajax验证,如果都返回true,则提交表单;
如果不注释掉:async:false 没问题,但注释掉后,因为是异步传输,submit的时flag值还没来得及返回,所以都为false
表单提交不了
求:如果选择默认的async:true  该怎么判断,然后提交

解决方案 »

  1.   

    如果要用async:true采用异步的话,在jQuery 1.5+下面可以用.deferred这个新的概念。其基本思想是让几个不同的操作全部完成后再执行另外的一些操作。具体实现看例子了
    http://jqapi.com/#p=deferred.done
      

  2.   

    兄弟,杀鸡也要牛刀?牛刀30斤,杀鸡刀3两,你宁愿用牛刀?看看,砸到自己了不是?呵呵。
    --------------
    <form action="1.jsp" onsubmit="validCheck(this);">
    你到validCheck里把文本框遍历一遍不就ok?何必要AJAX呢?
      

  3.   

    有个情况是,第一次我所有的填写正确---提交---通过!
    然后我点浏览器的“后退”按钮,返回到刚才的页面,除了password其他的输入框内容都会保留上次填写的
    这个时候我输入个密码 如果不ajax,又可以提交了!
    现在不要这样...
      

  4.   

    登录以后有session的呀。session不为空你就不让提交好了
      

  5.   

    一般网站管理一个用户,通常是采用在其成功登陆后,立即给他赋值一个session()。例如,ASP中:
    username="zhangsan"
    if 他是合法用户 then
      session("username")=username
      response.cookies("username")=username
      '..............
    else
      '.............
    end if
    所以,在他后退以后再次提交的时候,你只要判断session("username")不为空,就不让他提交表单就OK了;
    ----------------
    至于email的可用性的问题,你不应该放在表单提交的时候进行,应该在下面红字处进行验证
    <input type="text" id="email" flag="0" onblur="myajax()" />
      

  6.   

    设全局变量,提交的时候while等待
    每个success+1直到等于你需要验证的数目跳出while提交
      

  7.   

    谢谢!
    不过这样Email又回到上面那个问题了:用户注册成功后 点击浏览器“后退”,回到注册页,这时,除了Password
    其他的输入框还都保留刚才填过的信息, 这个时候输入个密码,点submit 就无法验证了
    或者怎么能让,用户点“后退”时 清空所有输入框的内容
      

  8.   

    这样要点两次submit 还是异步传输 submit比ajax的success 先执行的问题
      

  9.   

    哦,你一直没转过弯来:
    1、不要在提交页面的时候才去做AJAX的事情,这个时候当然有异步问题出现。比如email验证,你应该在该文本框失去焦点的时候就去AJAX到后台,验证输入的email是不是可用;
    <input type="text" id="email" flag="0" onblur="emailChk(this.value)" />
    2、类似email可用性验证这些外围的东东处理掉以后,才可点提交按钮提交表单。此时的
    <form action="1.jsp" onsubmit="return validCheck(this);">只是常规检查,看看是否为空等。3、关于history.back()返回的问题,你可以在提交后的页面用location的replace(好像是这个,记不清了;你自己查查)来清除前页的记忆;但最可靠的还是在validCheck()里用session("username")是否为空来判断:
    <script>
     function validCheck(f){
       if('<%=session("username")%>'!=""){
         alert('别乱搞,你已经登录了')
         return false;
       }
       //这里是常规检查.................
    } function emailChk(s){
      //ajax......
    }
    </script>
      

  10.   

    将ajax返回值赋值给一个标签,在你alert那块用setTimeout每个1s获取一次,如果值有了,就说明返回了,当然了,方法多多
      

  11.   

    你点两次submit不还是一样等在while么,只要ajax没执行success,全局变量没达到要求不都一直等在while?
      

  12.   

    这里有篇blog对Deferred object解释得比较好http://blog.darkthread.net/post-2011-02-12-jquery-1-5-notes1.aspx
      

  13.   

    大致写下吧,我并没测试过
    var sucNum = 0;//已成功返回的ajax个数,初始为0
    function(){
       ....... //你的其他代码
        success:function(){
            sucNum++;//每成功返回一个ajax就加次
         }
    }
    function submit(){
         var n=5;///这个是你的所有ajax个数,假设你有5个ajax需要返回值才能提交
         while(sucNum!=n){
                 //等着吧,ajax还有没返回的呢
          }
         //都返回了,可以提交了
    }