zoukankan      html  css  js  c++  java
  • ajax详解

    AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术(异步加载)。

    XMLHttpRequest 对象:

    open():简历到服务器的新请求。

    send():向服务器发送请求。

    abort():退出当前请求。

    readyState:提供当前HTML的就绪状态。

    status:响应的HTTP状态。

    responseText:服务器返回的请求响应文本。

    reponseXML:服务器反应的请求响应的XML。

    其实ajax的核心业务逻辑特别简单,首先new一个XMLHttpRequest(如果是兼容ie就用ActiveXObject),然后调用open()和send()方法,open表示建立链接,send表示发送.之后判断你发送的请求到什么状态也就是调用onreadystatechange,然后判断xmlHttp.readyState == 4 && xmlHttp.status == 200(4表示完成,200表示成功)则调用responseText取得返回结果即可。

    readyState可能返回的值:

    0:请求未初始化(还没有调用 open())。

    1:请求已经建立,但是还没有发送(还没有调用 send())。

    2:请求已发送,正在处理中(通常现在可以从响应中获取内容头)。

    3:请求在处理中;通常响应中已有部分数据可用了,但是服务器还没有完成响应的生成。

    4:响应已完成;您可以获取并使用服务器的响应了。

     1         if (window.ActiveXObject) { 
     2             xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 
     3         } else if (window.XMLHttpRequest) { 
     4             xmlHttp=new XMLHttpRequest(); 
     5         } 
     6         xmlHttp.open("get",'t_user/get_all_info',true); 
     7         xmlHttp.send();
     8         xmlHttp.onreadystatechange = function(data) { 
     9             if ((xmlHttp.readyState == 4) && (xmlHttp.status == 200)) 
    10             {
    11                 console.log(xmlHttp.responseText);
    12             } 
    13         }     

    上面代码就是基本的ajax原理,不过不同的请求方式我们的代码也有微微带动。

    get:

    1         xmlHttp.open("get",'t_user/get_all_info?name=admin',true); 
    2         xmlHttp.send();

    post:

    1         xmlHttp.open("post",'t_user/get_all_info',true); 
    2         xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    3         xmlHttp.send('name=admin');

    你一定观察到了,没错post方式比get方式多的setRequestHeader方法,这个方法可以理解成一个配置文件,如果没有这行代码,后台post方式是取不到name的。

    ajax一般用来链接后台接口实现前端页面和后台的数据交互,非常的好用。但是AJAX大量的使用了javascript和ajax引擎,这些取决于浏览器的支持.在编写的时候考虑对浏览器的兼容性.并且AJAX只是局部刷新,所以页面的后退按钮是没有用的.

    学会了ajax的基本原理我们也可以自己封装一个ajax的函数来实现交互:

           function ajax(query){
                var xmlHttp;
                var strData='';
                var init = {
                    type : "get",
                    dataType:"text",
                };
                (function(i,q){
                    for(var p in q){
                        i[p] = q[p];
                    }
                    console.log(init);
                })(init,query);
                
                for(var p in init.data){
                    strData += p + '=' + init.data[p] + '&';
                }
                
                console.log(strData);
                if (window.XMLHttpRequest) { 
                    xmlHttp=new XMLHttpRequest(); 
                } else if (window.ActiveXObject) { 
                    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 
                } 
                
                if(init.type.toUpperCase()=='GET'){
                    var url = init.url+'?'+strData;
                    xmlHttp.open(init.type, url, true);
                    xmlHttp.send();
                }else if(init.type.toUpperCase()=='POST'){
                    xmlHttp.open("post",init.url,true); 
                    xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
                    xmlHttp.send(strData);
                }
                xmlHttp.onreadystatechange = function() { 
                    if ((xmlHttp.readyState == 4) && (xmlHttp.status == 200)) 
                    {
                        var returnData;
                        if(init.dataType == 'text'){
                            returnData = xmlHttp.responseText;
                        }else if(init.dataType == 'json'){
                            returnData = JSON.parse(xmlHttp.responseText);
                        }else if(init.dataType == 'xml'){
                            returnData = xmlHttp.responseXML;
                        }
                        init.success && init.success(returnData);
                    } 
                } 
                
            }

    上述代码中运用到了函数立即调用和对象合并的概念,代码如下:

               (function(i,q){
                    for(var p in q){
                        i[p] = q[p];
                    }
                    console.log(init);
                })(init,query);

    其目的是为了实现传入函数的初始化。剩下的无非是一些判断来根据不同的情况来使用不同的语法。

    例如:

                        var returnData;
                        if(init.dataType == 'text'){
                            returnData = xmlHttp.responseText;
                        }else if(init.dataType == 'json'){
                            returnData = JSON.parse(xmlHttp.responseText);
                        }else if(init.dataType == 'xml'){
                            returnData = xmlHttp.responseXML;
                        }
                        init.success && init.success(returnData);

    这段代码就是为了根据传入不同的dataType来决定不同的返回类型。是不是看起来特别简单呢?我猜测jquery的底层代码核心业务逻辑也就不过如此了(虽然没去读过jquery底层代码- -),只不过jquery的代码比我这个代码要健壮的多得多的多。

    AJAX(Jquery):

    jquery中封装的ajax有三种方法:

    $.get();

    $.post();

       $.post("test.php", { name: "zhang"},
          function(data){
            alert("Data Loaded: " + data);
       },'text');

    $.ajax();

                      $.ajax({
                        url: 't_user/regist_account',
                        type: 'post',
                        data: {
                            name:admin
                        },
                        dataType: 'text'
                      }).done(function (date) {
                              console.log(date);
                            if(date =='success'){
                                alert('succcess');
                            }else if(date == 'fail'){
                                alert('fail');
                            }
                      });

    上面的代码来看jquery封装的ajax还是非常方便的,我们只需要给定需要请求的路径,方式,数据,返回类型等就会得到后台预期的数据,function里面的date(形参)就是后台返回的数据,数据类型决定于你传的dataType参数。

    前端技术有不少前端框架,当然也封装了不少ajax的方法,下面我们来看angularJS中ajax的用法:

    myModule.controller('aa',['$scope','$http',function(s,h){
                s.stu = {
                    user:"",
                    pwd:""
                };
                s.login = function(){
                    console.log(s.stu.user);
                    if(s.stu.user==""||s.stu.pwd==""){
                        alert("账号或密码不能为空!!!");
                    }else{
                        h({
                        method:'post',
                        url:'t_user/login_on',
                        data:{
                            "name":s.stu.user,
                            "pwd" :s.stu.pwd
                        },
                        //配置文件----请勿改动start
    //                    headers:{'Content-Type': 'application/x-www-form-urlencoded'},  
    //                       transformRequest: function(obj) {  
    //                         var str = [];  
    //                         for(var p in obj){  
    //                           str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));  
    //                         }  
    //                         return str.join("&");  
    //                       }  
                           //配置文件----请勿改动start
                        }).success(function(data){
                            console.log(data.is_teacher);
                            if(data!='fail'){
                                alert('登录成功!!!');
                                if(data.is_teacher==2){
                                    window.location.href = 't_user/href_tea';
                                }else if(data.is_teacher==1){
                                    window.location.href = 't_user/href_tea';
                                }else if(data.is_teacher==0){
                                    window.location.href = 't_user/href_stu';
                                }
                                
                            }else{
                                alert('账号或密码错误,请从新输入!!!');
                            }
                        }).error(function(data){
                            console.log(data);
    //                        alert('请正确输入!!!');
                        });
                    }
                };
            }]);

    我们在一个为aa的controller写一个ajax请求。angular的服务器交互需要一个$http服务。angularJS中的$http服务将send方法进行了简单的封装,打包成一个服务模块的形式提供开发者。调用后返回一个对象有两个回调方法success,error。success内接收成功后操作,error中接收错误时的操作。使用方法和Jquery封装的方法基本相似。

    最后:谢谢大家看到这里,如果我上述有错误请一定留言指正,希望大家技术一起进步!

  • 相关阅读:
    我回来了
    wget 官方jdk
    linux rpm命令安装卸载 初步使用
    关于一些对location认识的误区(转)
    直接插入排序
    冒泡排序
    Wireshark下TCP三次握手四次挥手
    linux内存使用率详解
    Linux下硬盘使用率详解及shell脚本实现
    Linux下CPU使用率详解
  • 原文地址:https://www.cnblogs.com/jcscript/p/5628447.html
Copyright © 2011-2022 走看看