jQuery中的ajax服務端返回方式

1 html方式
這種方式是最常見的方式(默認方式),如果是IE7下執行和FireFox的對象是一樣的,XMLHttpRequest,上邊我們講了有onreadystatechanage事件,readyState屬性,當是html形式返回的時候,用到了另外一個屬性responseText,當readyState=4的時候,XMLHttpRequest對象自動將放回的值以字符串的形式賦值給該屬性(這個不是jQuery的功能,是XMLHttpRequest),jQuery返回該字符串(這裏如果返回值中有JS代碼,並不執行),執行 sucuess回調函數,比如html()、append()等等,這些函數講html代碼裝載到當前頁面的時候才執行其中包含的js代碼,而且該代碼只執行一次並不緩存。詳細的說明請看文件操作函數說明。
示例代碼:
$.ajax({
        type: "get",
        url: "http://www.duteba.com/",
        dataType: "html",//(可以不寫,默認)
              beforeSend: function(XMLHttpRequest){
                     //ShowLoading();
              },
              success: function(data, textStatus){
                     alert(data);//data是一個字符串對象
              },
              complete: function(XMLHttpRequest, textStatus){
                     //HideLoading();
              },
              error: function(){
                     //請求出錯處理
              }
});
 
2 xml方式
xml方式和html方式的整個工作流程是一樣,就是操作了不同的屬性,返回不同的對象,html方式操作的responseText屬性,而xml方式操作的是responseXML屬性,html返回是一個String對象,而xml 返回的是一個XML對象。操作返回值的時候就大不相同,必須按照XML對象的方式進行操作,如果用alert(),結果肯定是object,相關的操作可以看看xml document 對象屬性手冊(附件)。xml和html不一樣,定義很嚴格,沒有容錯機制,如果被請求的xml寫的不正確,或者是不完整,jQuery拋出一個異常,Ajax請求終止。
示例代碼:
$.ajax({
        url:'http://www.duteba.com/my.xml',
        type: 'GET',
        dataType: 'xml',
        timeout: 3000,
        error: function(xml){
             alert('Error loading XML document'+xml);
        },
        success: function(x){
             alert(x.xml);//xml的xml屬性只在IE下支持
        }
});
3 json方式
    json方式和html方式在請求和服務器中完全是一樣,就不在重複說明,請求的返回值實際上都是String對象,有兩點不同,第一:html方式的時候並沒有限制返回的字符串格式,而json方式的時候,必須符合json協議的規範。第二:html方式請求完成之後沒有做任何的操作直接回調sucuess,而json多了一步就是加了eval,執行返回的字符串,看看源碼data = eval("(" + data + ")");返回json對象。
示例代碼:
$.ajax({
    url:'http://www.duteba.com/my.js',
    //{‘name’:’name’,’test’:’test’}
    type: 'GET',
    dataType: json,
    timeout: 3000,
    error: function(xml){
        alert('Error loading XML document'+xml);
    },
    success: function(data){
        $.each(data,function(i,n){
            alert(n);//顯示name和test
        });
    }
});
 
4 js方式
    js方式和jsonp方式應該嚴格意義上不屬於Ajax範疇,屬於瀏覽器對含有src屬性標籤的二次請求原理。當然這裏只用了script標籤,工作原理就是在head中創建一個script標籤,src屬性就是url,瀏覽器自動加載js文件,並執行(不緩存,只執行一次)。由於他不是真正意義上的Ajax,所以jQuery定義的全局Ajax事件並不能完全觸發,只能觸發兩個事件 ajaxSuccess和ajaxComplete。
示例代碼:
$.ajax({
    url:'http://www.duteba.com/my.js'
,
    //alert(‘test’)
    type: 'GET',
    dataType: script,
    timeout: 3000,
    success: function(data){
        alert(‘load js success’);
    }
});
 
5 jsonp方式
jsonp方式的交互方式和js是一樣的,本身xmlHttpRequest對象並不能跨域訪問,但是script標籤的src可以跨域訪問,這裏就注意兩個概念:第一Ajax是不能跨域操作的,第二jQuery的jsonp是可以跨域操作,jsonp到底是什麼東西呢?他是一個非官方的定義,目前的規範,需要服務器和客戶端進行配合使用,服務器返回必須是這樣的格式:
xxx(json對象);xxx是客戶端定義的函數名字.
客戶端需要這樣的定義格式url?callback=xxx,這個的callback和xxx都是自己定義,只要服務器端能理解即可。如果沒有定義xxx函數默認是?,jQuery會自動將?替換成內部定義的函數jquery12345678990這樣的形式。
爲什麼需要這樣定義呢?因爲js本身不能操作script標籤src請求結果中的數據(如果想操作就需要用DOM獲得innerText再加上eval)。就定義一個客戶端函數,將請求的結果以參數的形式傳遞進去,就可以操作了。
示例代碼:
jsonp.php
<?php
echo $_GET[‘callback’].“({‘name’,’name’});”;
jsonp.aspx
Response.Write(Request["callback "] + "({'name': 'name'});");
jquery代碼
$.ajax({
              url:' http://www.duteba.com/jsonp.php?callback=test',
              //alert(‘test’)
              type: 'GET',
              dataType: jsonp,
              timeout: 3000,
              success: function(data){
                  alert(‘load jsonp success’);
              }
});
function test(data){
   alert(data);
}
 
6 jQuery中ajax全局事件的應用
    大家看到這個題目的時候可能有點糊塗,ajax還有事件?答案是否定的。只是jQuery爲了控制Ajax的流程,比如停止,監聽當前的狀態等等而自己定義的事件,這個事件說簡單點就是自定義函數,在Ajax執行不同狀態調用,作者形象的定義成事件和觸發事件,實際就是函數和調用函數,jQuery共定義了 ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend6個事件,下邊就逐個介紹。
    1 ajaxStart
在調用Ajax的時候首先就會觸發該事件,Ajax計數器加1,不傳遞任何參數。
源碼:jQuery.event.trigger( "ajaxStart" );
    2 ajaxStop
Ajax執行到complete最後的時候觸發該事件,Ajax計數器減1,不傳遞任何參數。
源碼:jQuery.event.trigger( "ajaxStop" )
    3 ajaxComplete
Ajax執行到complete後邊觸發ajaxStop之前時候觸發該事件,傳遞數組對象,包含兩個元素第一是當前的XMLHttpRequest對象,第二個是當前Ajax的屬性對象,這個可以參考前邊的ajax參數列表。
源碼jQuery.event.trigger( "ajaxComplete", [xhr, s] );//xhr就是當前的XMLHttpRequest對象,s就是Ajax的屬性對象
    4 ajaxError
捕獲到XMLHttpRequest異常的時候會觸發該事件,傳遞數組對象,包含三個元素第一是當前的XMLHttpRequest對象,第二個是當前Ajax的屬性對象,這個可以參考前邊的ajax參數列表,第三個是錯誤代碼。
源碼:jQuery.event.trigger( "ajaxError", [xhr, s, e] );
    5 ajaxSuccess
Ajax執行到success最後的時候觸發該事件,傳遞數組對象,包含兩個元素第一是當前的XMLHttpRequest對象,第二個是當前Ajax的屬性對象,這個可以參考前邊的ajax參數列表。
源碼:jQuery.event.trigger( "ajaxSuccess", [xhr, s] );
    6 ajaxSend
執行beforeSend之後,XMLHttpRequest調用send之前,觸發該事件,傳遞數組對象,包含兩個元素第一是當前的XMLHttpRequest對象,第二個是當前Ajax的屬性對象,這個可以參考前邊的ajax參數列表。
源碼:jQuery.event.trigger("ajaxSend", [xhr, s]);
最後我們舉個簡單的例子,就應該明白如果使用這些事件控制整個Ajax流程了,比如一個頁面上有三給Ajax請求(都是異步請求),但是需求是不能鎖住瀏覽器還要Ajax順序執行,意思就是第一個Ajax執行完成之後才執行第二個,再執行第三個,如果有一個異常,其他的Ajax也不需要請求,這樣的情況的時候這些事件就派上用場了。
示例代碼:
var AjaxStack=[];//Ajax等待執行隊列(先進先出)
$(document).ajaxSuccess(function(o,s){
       AjaxStack.shift();
});
$(document).ajaxComplete(function(){
       var tmp=AjaxStack.shift();
    if(tmp){
        $(tmp[0]).loading(tmp[1],tmp[2],tmp[3]);
    }
});
$.fn.loading function(u, opt, f){
    AjaxStack.push([this,u,opt,f]);
    if($.active){
           return;
    }
    $.ajax({
                data: opt,
                type: "get",
                url: u,
                beforeSend: function(XMLHttpRequest){
                       //加一些效果測試是不是順序執行的
                },
                success: function(data, textStatus){
                   //sucuss
                },
                complete: function(XMLHttpRequest, textStatus){
                   //complete
                }
    });
}
$(‘#test1’).loading(‘test1.html’);
$(‘#test2’).loading(‘test2.html’);
$(‘#test3’).loading(‘test3.html’);
注意,在Ajax 全部事件申明的時候,也是jQuery 對象,但是該對象不起任何作用,只是爲了能訪問到,所以說$(document).ajaxComplete(function(){}) 和$(‘#test1’).ajaxComplete(function(){}) 是等價的。爲了命名規範你可以定義成和Ajax 調用的對象是一致,但是沒有任何實際意義,從觸發的源碼中應該看出,他用的是全局對象jQuery 。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章