Ajax

一、ajax是什么?
ajax: asynchronous javascript and xml: 異步的javascript和xml。
ajax是一種用來改善用戶體驗的技術,其本質是利用瀏覽器內置的一種特殊的對象(XMLHttpRequest)異步(即發送請求時,瀏覽器不會銷毀當前頁面,用戶可以繼續在當前頁面做其它的操作)的向服務器發送請求,并且利用服務器返回的數據(不再是一個完整的頁面,只是部分的數據,一般使用文本或者xml返回)來部分更新當前頁面。
使用ajax技術之后,頁面無刷新,并且不打斷用戶的操作。
二、ajax編程的基本步驟

  1. 獲取ajax對象(XmlHttpRequest)
  2. 使用 XmlHttpRequest向服務器發送請求
  3. 在服務器端處理請求
  4. 在監聽器當中,處理服務器返回的響應
    其中:ajax對象的屬性
    a. onreadystatechange: 綁訂一個事件處理函數(即: 注冊一個監聽器)
    當ajax對象的readyState值發生了改變(比如, 從0-->1),就會產生readystatechange事件。
    b. responseText: 獲得服務器返回的文本
    c. responseXML: 獲得服務器返回的XML dom對象
    d. status: 獲得狀態碼
    e. readyState: 返回ajax對象與服務器通訊的狀態。返回值是一個number類型的值,不同的值表示不同的含義:
    0: (為初始化) --> 對象已建立,但是尚未初始化(尚未調用 open方法)
    1: (初始化) --> 對象已建立,尚未調用send方法
    2: (發送數據) --> send方法已調用
    3: (數據傳送中) --> 已接受部分數據
    4: (響應結束) --> 接收了所有的數據
    三. 選擇POST還是GET
    如果請求不改變服務器狀態只是取回數據則使用GET.GET請求被緩存起來,如果多次提取相同的數據可提高性能;只有當URL和參數的長度大于2048個字符時才使用POST提取數據在IE下URL過長會導致請求參數被截斷;
    完整封裝代碼:
//小工具函數,把Json對象轉URL字符串;
function json2url(json){
    json.t = Math.random();
    var arr = [];
    for(var name in json){
        arr.push(name+'='+encodeURIComponent(json[name]));
    }
    return arr.join('&');
}
//Aja函數封裝,接收一個Json對象
/*
url:服務器地址
data:數據
type:發送方式,默認GET
timeout:超時時間,默認5s
success:成功回調函數
error:失敗回調函數
*/
function ajax(json){
    var json = json||{};
    if(!json.url)return;
    json.data = json.data || {};
    json.type = json.type || 'get';
    json.timeout = json.timeout || 5000;
  //獲取Ajax對象,XMLHttpRequest并沒有標準化,要區分瀏覽器
    if(window.XMLHttpRequest){
  //非IE瀏覽器
        var oAjax = new XMLHttpRequest();
    }else{
  //IE瀏覽器
        var oAjax = new ActiveXObject('Microsoft.XMLHTTP');
    }
    switch(json.type.toLowerCase()){
        case 'get':
            oAjax.open('GET',json.url+'?'+json2url(json.data),true);
            oAjax.send();
            break;
        case 'post':
            oAjax.open('POST',json.url,true);
  //因為按照http協議的要求,如果發送的post請求,請求數據包里面,應該有一個消息頭 content-type。但是,ajax對象默認沒有,所以,需要調用setRequestHeader方法。
            oAjax.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
            oAjax.send(json2url(json.data));
            break;
    }
    var timer = setTimeout(function(){
        oAjax.onreadystatechange=null;
        json.error&&json.error('親,網絡不給力');
    },json.timeout);
    oAjax.onreadystatechange=function(){
        if(oAjax.readyState==4){
            clearTimeout(timer);
            if(oAjax.status>=200&&oAjax.status<300||oAjax.status==304){
                json.success&&json.success(oAjax.responseText);
            }else{
                json.error&&json.error(oAjax.status);
            }
        }
    };
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容