1. 程式人生 > 其它 >淺談ajax的使用以及一些實用方法

淺談ajax的使用以及一些實用方法

什麼是ajax

簡介:ajax是一種無需要載入整個網頁的情況下,能夠更新部分網頁的技術

ajax是一種用於建立快速動態網頁的技術,傳統的網頁(如果不使用ajax)如果需要更新內容,必須載入整個網頁頁面.

post和get的區別

get:請求是在位址列上,資訊不安全.傳資料流量小,一般限制在2k

建立請求物件

所有現代的瀏覽器均支援XHttpRequest物件(ie5和ie6使用ActiveXObject)

 1 // IE 7 +, Firefox,Chrome, Opera, Safari 瀏覽器執行程式碼
 2  let request  = new XMLHttpRequest();
 3
4 // IE6, IE5 瀏覽器執行程式碼 5 let request = new ActiveXObject('Microsoft.XMLHTTP'); 6 //相容寫法 7 8 let http = null; 9 10 if(window.XMLHttpRequest){ 11 12 http = new XMLHttpRequest(); 13 14 }else{ 15 16 http = new ActiveXObject('Microsoft.XMLHTTP'); 17 18 }

向伺服器傳送請求

如果需將請求傳送到伺服器,我們使用 XMLHttpRequest 物件的 open() 和 send() 方法

open(method,url,async):

method:請求的型別;GET 或 POST

url:檔案在伺服器上的位置

async: true(非同步)或 false(同步)

send(string):

string:僅用於 POST 請求

伺服器響應(onreadystatechange 事件)

當請求被髮送到伺服器時,我們需要執行一些基於響應的任務,每當 readyState 改變時,就會觸發 onreadystatechange 事件,readyState 屬性存有 XMLHttpRequest 的狀態資訊。

onreadystatechange:儲存函式(或函式名),每當 readyState 屬性改變時,就會呼叫該函式。

readyState: (0.請求未初始化 1.伺服器連線已建立 2.請求已接收 3.請求處理中 4.請求已完成,且響應已就緒)

status: (200: "OK" 404: 未找到頁面)

當 readyState 等於 4 且狀態為 200 時,表示響應已就緒:

  let btn = document.querySelector('.btn');
  
   btn.addEventListener('click', function(){
        loadInfo();
   });
   


   function loadInfo(){
        
   let http = null;

    if(window.XMLHttpRequest){

        http = new XMLHttpRequest(); 

    }else{

        http = new ActiveXObject('Microsoft.XMLHTTP');

    }

    http.onreadystatechange = function(){

        if(http.readyState == 4 && http.status == 200){
             console.log(http.responseText);
        }else{
             console.log("請求失敗了");
        }

    }

    http.open('GET','http://www.ysqorz.top:8888/api/private/v1/rights/list');
    http.send();
}

案例(post請求登入)

 let btn = document.querySelector('.btn');

  let username = document.querySelector(".username");
  let password = document.querySelector(".psd");
  let value1 = '';
  let value2 = '';
   btn.addEventListener('click', function(){
         value1 = username.value;
         value2 = password.value;
       
       // console.log(value1);
        loadInfo();
   });
   

   //請求

   function loadInfo(){

   
        
   let http = null;

    if(window.XMLHttpRequest){

        http = new XMLHttpRequest(); 

    }else{

        http = new ActiveXObject('Microsoft.XMLHTTP');

    }

    http.onreadystatechange = function(){

        if(http.readyState == 4 && http.status == 200){
             console.log(http.responseText);
        }

    }

    http.open('POST','http://www.ysqorz.top:8888/api/private/v1/login');
    http.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    http.send('username='+value1+'&'+'password='+value2);
}

ajax請求程式碼封裝

 ajax({
        url:'http://www.ysqorz.top:8888/api/private/v1/login',
        type:"POST",
        data:{
            username:"admin",
            password:123456
        },
        timeout:5000,                //過期時間
        success:function(res){
             
            console.log(res);

        },
        error:function(error){

            // console.log("錯誤資訊"+error);

        }
    })




    function ajax(obj){

         obj = obj || {};

        obj.type = (obj.type || "GET" ).toLowerCase();   //預設請求方式GET;

        //獲取請求引數
        let params = formatParams(obj.data);


        //請求物件的相容
        let http = null;

        if(window.XMLHttpRequest){

            http = new XMLHttpRequest(); 

        }else{

            http = new ActiveXObject('Microsoft.XMLHTTP');

        }


        //發起請求

        if(obj.type == "get"){

            http.open('GET',obj.url+"?"+params);
            http.send(null);

        }else if(obj.type == "post"){
            http.open('POST',obj.url);

            http.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

            http.send(params);
        }



        //超時處理

         setTimeout(function(){
             
              if(http.readyState != 4){
                   http.abort();    //終止請求
              }

         },obj.timeout);




            http.onreadystatechange = function(){

                if(http.readyState == 4 && http.status == 200){
                    
                      obj.success && obj.success(JSON.parse(http.responseText));
                
                }else{

                      obj.error && obj.error(http);
                }

            }

    }



    //格式化引數

   function formatParams(objParams){

       let newArr  = [];

        for(let name in objParams){
            newArr.push(name+"="+objParams[name]);
        }

        return newArr.join("&");
    }

這裡還為總結了一下,通用ajax格式

function ajaxs(url,type,data,dataType,sCallback,fCallback){
    $.ajax({
        type:type,
        url:url,
        async:true,
        contentType : "application/json; charset=utf-8",
        data:data,
        jsonp:'jsoncallback',
        dataType:dataType,
        success:function(jsondata){
            sCallback && sCallback(jsondata);
        },
        error:function(e){
            fCallback && fCallback();
        }
    });
}

function ajaxData(){
ajaxs('http://.....','post',jsons,'jsonp',function(data){
console.log(data);
},function(e){alert('失敗'+e)});
}

ajax請求資料,返回文字格式

$.ajax({
          type: "POST",
          url: "請求地址",
          data : {
                   username : '引數1'
               },
          dataType: "text",//請求引數的格式為json.另外還有text等
          async: false,//這裡預設為false,即非同步請求,如果為true就是同步
          success: function(data){
                 //成功返回資訊
              console.log(data);
          },
          error: function (message) {
                //錯誤返回資訊
          }
});

ajax請求資料,返回JSON格式

//資料格式
[{"ID":0,"title":"4220"},{"ID":0,"title":"4220"}]
$.ajax({
          type: "POST",
          url: "請求地址",
          data : {
                   username : '引數1'
               },
          contentType: "application/json; charset=utf-8",
          dataType: "json",//請求引數的格式為json.另外還有text等
          async: false,//這裡預設為false,即非同步請求,如果為true就是同步
          success: function(data){
                 //成功返回資訊
                 var obj = eval(data);
                 //注意:使用eval來解析JSON格式字串的時候,會將{}解析為程式碼塊,而不是物件的字面量
        //1.在JSON格式的字串前面拼接上 "var o ="
        //2.把JSON格式的字串使用()括起來,就不會將{}解析為程式碼塊,而是表示式
                 console.log("MY:" + obj[0].title);
          },
          error: function (message) {
                //錯誤返回資訊
          }
});

json常用的方法

JSON.parse() :

JSON 通常用於與服務端交換資料,在接收伺服器資料時一般是字串。我們可以使用 JSON.parse() 方法將資料轉換為 JavaScript 物件。

JSON.stringify():

JSON 通常用於與服務端交換資料,在向伺服器傳送資料時一般是字串,我們可以使用 JSON.stringify() 方法將 JavaScript 物件轉換為字串。