欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

javascript - ajax:怎么获得onreadystatechange调用的函数的返回值?

程序员文章站 2022-06-03 21:25:56
...
这里的checkName()w为什么不能是我所期待的返回值(true/false),怎么获得chekName()的返回值,在使用ajax的基础上?求高人指点,
刚开始学习使用ajax进行表单验证;遇到这种问题不知道怎么解决?
,表单的内容是这样的,下面是几个主要的验证函数,
function checkName(){  
    var name=ele.name.value;    
    if(name!= ""){ 
            xmlhttp=new XMLHttpRequest();
                url="http://localhost/chkname.php";        
            xmlhttp.onreadystatechange =function(){
                if(xmlhttp.readyState == 4){
                    if(xmlhttp.status == 200){
                        var msg = xmlhttp.responseText;
                        if(msg == '1'){                            
                              ele.name.className="";//移除class
                              ele.imgs[0].setAttribute("src","img/right.jpg"); //对应图标
                              ele.imgs[0].style.display = "inline"; //显示 
                             return true;
                        }else{                            
                              ele.name.className="borderRed";//移除class
                              ele.imgs[0].setAttribute("src","img/wrong.jpg"); //对应图标
                              ele.imgs[0].style.display = "inline"; //显示   
                                biaoqian1.innerHTML='该用户名已存在';                         
                               return  false;
                           
                                                
                        }
                    }
                }
            }
            xmlhttp.open('POST',url,true);
            xmlhttp.send(null);
            
    
}
 function check(){ //表单提交则验证开始

         if(checkName()&&checkPassw2()&&checkEmail()){
               alert(" 注册成功");  //注册成功
            return true; 
          }
          else{
              alert("请正确的填写完信息!");
            return false;
          }
    }

  

回复内容:

这里的checkName()w为什么不能是我所期待的返回值(true/false),怎么获得chekName()的返回值,在使用ajax的基础上?求高人指点,
刚开始学习使用ajax进行表单验证;遇到这种问题不知道怎么解决?

,表单的内容是这样的,下面是几个主要的验证函数,
function checkName(){  
    var name=ele.name.value;    
    if(name!= ""){ 
            xmlhttp=new XMLHttpRequest();
                url="http://localhost/chkname.php";        
            xmlhttp.onreadystatechange =function(){
                if(xmlhttp.readyState == 4){
                    if(xmlhttp.status == 200){
                        var msg = xmlhttp.responseText;
                        if(msg == '1'){                            
                              ele.name.className="";//移除class
                              ele.imgs[0].setAttribute("src","img/right.jpg"); //对应图标
                              ele.imgs[0].style.display = "inline"; //显示 
                             return true;
                        }else{                            
                              ele.name.className="borderRed";//移除class
                              ele.imgs[0].setAttribute("src","img/wrong.jpg"); //对应图标
                              ele.imgs[0].style.display = "inline"; //显示   
                                biaoqian1.innerHTML='该用户名已存在';                         
                               return  false;
                           
                                                
                        }
                    }
                }
            }
            xmlhttp.open('POST',url,true);
            xmlhttp.send(null);
            
    
}
 function check(){ //表单提交则验证开始

         if(checkName()&&checkPassw2()&&checkEmail()){
               alert(" 注册成功");  //注册成功
            return true; 
          }
          else{
              alert("请正确的填写完信息!");
            return false;
          }
    }

  

异步的ajax实际上使用了单独的进程,因此无法获取到这个返回值,而且,在调用ajax()方法时你根本无法知道它什么时候会执行完毕。 因此对于异步的ajax来说,你无法主动的获取其返回值,只能提供回调方法,ajax对象可以将参数传递到你提供的回调方法中,如上面,自己通过回调函数获得了返回值。

 //ajax验证name
 var ajaxResult = false;//全局变量
    function ajaxResultdeal(response){
        ajaxResult = response; //传递给全局变量    
            if(ajaxResult == '1'){                            
                                  ele.name.className="";//移除class
                                  ele.imgs[0].setAttribute("src","img/right.jpg"); //对应图标
                                  ele.imgs[0].style.display = "inline"; //显示 
                                  ajaxResult= true;
    
                              }
          else{                        
                                  ele.name.className="borderRed";//移除class
                                  ele.imgs[0].setAttribute("src","img/wrong.jpg"); //对应图标
                                  ele.imgs[0].style.display = "inline"; //显示   
                                    biaoqian1.innerHTML='该用户名已经存在';                         
                                  ajaxResult=false;
                               
                                                    
                            }
                
            ajaxResultreturn();
        
       
    
    }
    function ajaxResultreturn(){
        if(ajaxResult){return true;}
        else{
            return false;
        }
    }
    
    function toAjax(url,callback){                
                xmlhttp=new XMLHttpRequest();
                    /*url="http://localhost/chkname.php"; */       
                xmlhttp.onreadystatechange =function(){
                    if(xmlhttp.readyState == 4){
                        if(xmlhttp.status == 200){                    
                                if(callback) {
                                   callback(xmlhttp.responseText);
                          
                            }
                        }
                    }
                }
                xmlhttp.open('POST',url,true);
                xmlhttp.send(null);
    }
    
      function checkName(){ 
        var name=ele.name.value;    
        var url="http://localhost/chkname.php";   
           var cb = ajaxResultdeal;       
                toAjax(url,cb);   
            
       
      
    
      }
      function check(){ //表单提交则验证开始 

         if(ajaxResultreturn()&&checkPassw2()&&checkEmail()){
               alert(" 注册成功");  //注册成功
            return true; 
          }
          else{
              alert("请正确的填写完信息!");
            return false;
          }
    }
      

一楼回答的很详细。使用ajax的原因是因为异步加载,这需要你转变你的思路,不能用同步的思想去写异步的代码。
给你一个经典逻辑帮助你入门吧

function beforeAjax() {
    //一些基础的工作,比如非空验证,获得url,参数字符串等
    doAjax();
}
function doAjax() {
    var ajax = new Ajax;//这是伪码
    ajax.onSuccess = afterAjax; //这是伪码,可能是onSuccess, onReadyStatusChange等任何事件,只要你的ajax对象支持的就行。
    ajax.send();
}
function afterAjax(param1, param2, etc...) {
    //后续的处理
}

这个就是三步走方式的异步代码模型了,首先做好准备,然后开始异步处理,我们不知道异步处理什么时候会完成,所以能做的就是告诉异步处理对象,当xx事发生的时候请调用一下xx方法。

相关标签: javascript php