jQuery與Ajax的應(yīng)用

2018-4-11    seo達(dá)人

如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中, 請(qǐng)點(diǎn)這里


一、Ajax的XMLHttpRrequest對(duì)象

Ajax的核心是XMLHttpRequest對(duì)象(發(fā)送異步請(qǐng)求、接受響應(yīng)及執(zhí)行回調(diào)),它是ajax實(shí)現(xiàn)的關(guān)鍵

XMLHttpRequest對(duì)象的open()方法與send()方法

方法 描述
open(method,url,async)

規(guī)定請(qǐng)求的類型、URL 以及是否異步處理請(qǐng)求。

  • method:請(qǐng)求的類型;GET 或 POST
  • url:文件在服務(wù)器上的位置
  • async:true(異步)或 false(同步)
send(string)

將請(qǐng)求發(fā)送到服務(wù)器。

    • string:僅用于 POST 請(qǐng)求

請(qǐng)求類型,GET 還是 POST?

與 POST 相比,GET 更簡(jiǎn)單也更快,并且在大部分情況下都能用。

然而,在以下情況中,請(qǐng)使用 POST 請(qǐng)求:

  • 無(wú)法使用緩存文件(更新服務(wù)器上的文件或數(shù)據(jù)庫(kù))
  • 向服務(wù)器發(fā)送大量數(shù)據(jù)(POST 沒(méi)有數(shù)據(jù)量限制)
  • 發(fā)送包含未知字符的用戶輸入時(shí),POST 比 GET 更穩(wěn)定也更可靠

(1). GET請(qǐng)求

[javascript] view plain copy
  1. //簡(jiǎn)單的get請(qǐng)求,可能得到的是緩存的結(jié)果  
  2. xmlhttp.open("GET","demo_get.asp",true);  
  3. xmlhttp.send();  
  4. //為了避免上述情況,請(qǐng)向 URL 添加一個(gè)唯一的ID  
  5. xmlhttp.open("GET","demo_get.asp?t=" + Math.random(),true);  
  6. xmlhttp.send();  
  7. //若希望通過(guò) GET 方法發(fā)送信息,請(qǐng)向 URL 添加信息  
  8. xmlhttp.open("GET","demo_get2.asp?fname=Bill&lname=Gates",true);  
  9. xmlhttp.send();  

(2). POST請(qǐng)求

[javascript] view plain copy
  1. //簡(jiǎn)單的POST請(qǐng)求  
  2. xmlhttp.open("POST","demo_post.asp",true);  
  3. xmlhttp.send();  
  4. //如果需要像HTML表單那樣POST數(shù)據(jù),請(qǐng)使用 setRequestHeader()來(lái)添加HTTP頭。  
  5. //然后在send()方法中規(guī)定您希望發(fā)送的數(shù)據(jù)  
  6. xmlhttp.open("POST","ajax_test.asp",true);  
  7. xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");  
  8. xmlhttp.send("fname=Bill&lname=Gates");  
方法 描述
setRequestHeader(header,value)

向請(qǐng)求添加 HTTP 頭。

  • header: 規(guī)定頭的名稱
  • value: 規(guī)定頭的值


async參數(shù)設(shè)置

XMLHttpRequest對(duì)象如果要用于AJAX的話,其open()方法的async參數(shù)必須設(shè)置為true

通過(guò) AJAX,JavaScript 無(wú)需等待服務(wù)器的響應(yīng),而是:

  • 在等待服務(wù)器響應(yīng)時(shí)執(zhí)行其他腳本
  • 當(dāng)響應(yīng)就緒后對(duì)響應(yīng)進(jìn)行處理

(1). 當(dāng)使用 async=true 時(shí),請(qǐng)規(guī)定在響應(yīng)處于 onreadystatechange 事件中的就緒狀態(tài)時(shí)執(zhí)行的函數(shù):

[javascript] view plain copy
  1. xmlhttp.onreadystatechange=function()  
  2.   {  
  3.   if (xmlhttp.readyState==4 && xmlhttp.status==200)  
  4.     {    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;  
  5.     }  
  6.   }  

(2). 當(dāng)您使用 async=false 時(shí),請(qǐng)不要編寫 onreadystatechange 函數(shù) - 把代碼放到 send() 語(yǔ)句后面即可:

[javascript] view plain copy
  1. xmlhttp.open("GET","test1.txt",false);  
  2. xmlhttp.send();  
  3. document.getElementById("myDiv").innerHTML=xmlhttp.responseText;  

服務(wù)器響應(yīng)

使用 XMLHttpRequest 對(duì)象的 responseText 或 responseXML 屬性。

屬性 描述
responseText 獲得字符串形式的響應(yīng)數(shù)據(jù)。
responseXML 獲得 XML 形式的響應(yīng)數(shù)據(jù)。


(1). 如果來(lái)自服務(wù)器的響應(yīng)并非 XML,請(qǐng)使用 responseText 屬性。

responseText 屬性返回字符串形式的響應(yīng),因此您可以這樣使用:

document.getElementById("myDiv").innerHTML=xmlhttp.responseText;


(2). 如果來(lái)自服務(wù)器的響應(yīng)是 XML,而且需要作為 XML 對(duì)象進(jìn)行解析,請(qǐng)使用 responseXML 屬性

[javascript] view plain copy
  1. xmlDoc=xmlhttp.responseXML;  
  2. txt="";  
  3. x=xmlDoc.getElementsByTagName("ARTIST");  
  4. for (i=0;i<x.length;i++)  
  5.   {  
  6.   txt=txt + x[i].childNodes[0].nodeValue + "<br />";  
  7.   }  
  8. document.getElementById("myDiv").innerHTML=txt;  
onreadystatechange事件

當(dāng)請(qǐng)求被發(fā)送到服務(wù)器時(shí),我們需要執(zhí)行一些基于響應(yīng)的任務(wù)。

每當(dāng) readyState 改變時(shí),就會(huì)觸發(fā) onreadystatechange 事件。readyState 屬性存有 XMLHttpRequest 的狀態(tài)信息。

下面是 XMLHttpRequest 對(duì)象的三個(gè)重要的屬性:

屬性 描述
onreadystatechange 存儲(chǔ)函數(shù)(或函數(shù)名),每當(dāng) readyState 屬性改變時(shí),就會(huì)調(diào)用該函數(shù)。
readyState

存有 XMLHttpRequest 的狀態(tài)。從 0 到 4 發(fā)生變化。

  • 0: 請(qǐng)求未初始化
  • 1: 服務(wù)器連接已建立
  • 2: 請(qǐng)求已接收
  • 3: 請(qǐng)求處理中
  • 4: 請(qǐng)求已完成,且響應(yīng)已就緒
status

200: "OK"

404: 未找到頁(yè)面

Ajax()函數(shù)示例:

  • 定義一個(gè)函數(shù),用于異步獲取信息
[javascript] view plain copy
  1. function Ajax(){  
  2.     //code  
  3. }  
  • 聲明一個(gè)空對(duì)象來(lái)裝入XMLHttpRequest對(duì)象
[javascript] view plain copy
  1. var xmlHttpReq = null;  
  • 給XMLHttpRequest對(duì)象賦值
[javascript] view plain copy
  1. if(window.ActiveXObject){  
  2.     xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");  
  3. }else if(window.XMLHttpRequest){  
  4.     xmlHttpReq = new XMLHttpRequest();  
  5. }  

IE5、IE6是以ActiveXObject的方式引入XMLHttpRequest對(duì)象的,而其他瀏覽器的XMLHttpRequest對(duì)象是window的子對(duì)象。

    • 實(shí)例化后,使用open()方法初始化XMLHttpRequest對(duì)象,指定HTTP方法和要使用的服務(wù)器URL
[javascript] view plain copy
  1. xmlHttpReq.open("GET","test.php",true);  
  • 因?yàn)橐鲆粋€(gè)異步調(diào)用,所以需要注冊(cè)一個(gè)XMLHttpRequest對(duì)象將調(diào)用的回調(diào)事件處理器當(dāng)做它的readystate值改變時(shí)調(diào)用。當(dāng)readyState值改變時(shí),會(huì)激發(fā)一個(gè)readystatechange事件,可以使用onreadystatechange屬性來(lái)注冊(cè)該回調(diào)事件處理器。
[javascript] view plain copy
  1. xmlHttpReq.onreadystatechange = RequestCallBack;  
  • 使用send()方法發(fā)送請(qǐng)求,因?yàn)檫@個(gè)請(qǐng)求使用的是HTTP的“GET”方式,所以可以在不指定參數(shù)或使用null參數(shù)的情況下調(diào)用send()方法
[javascript] view plain copy
  1. xmlHttpReq.send(null);  

當(dāng)請(qǐng)求改變時(shí),XMLHttpRequest對(duì)象調(diào)用onreadystatechange屬性注冊(cè)的事件處理器,因此在處理該響應(yīng)前,事件處理器首先應(yīng)該檢查readyState的值和HTTP的狀態(tài)。當(dāng)請(qǐng)求完成加載時(shí)(readyState==4)并且已經(jīng)響應(yīng)成功(status==200)時(shí),就可以調(diào)用JavaScript函數(shù)來(lái)處理該響應(yīng)內(nèi)容。

[javascript] view plain copy
  1. function RequestCallBack(){  
  2.     if (xmlHttpReq.readyState == 4) {  
  3.         if (xmlHttpReq.status == 200) {  
  4.             //將xmlHttpReq.responText的值賦予id為resText的元素  
  5.             document.getElementById('resText').innerHTML = xmlHttpReq.responText;  
  6.         }  
  7.     }  
  8. }  
二、jQuery中的Ajax

jQuery對(duì)Ajax操作進(jìn)行了封裝,在jQuery中$.ajax()方法屬于最底層的方法,第2層是load()、$.get()、$.post()方法,第3層是$.getScript()、$.getJSON()方法

1、load()方法    通常用來(lái)從WEB服務(wù)器上獲取靜態(tài)的數(shù)據(jù)文件

最常用的Ajax方法,能載入遠(yuǎn)程HTML代碼并插入DOM中

load(url[,data][,callback]);

  • url:String    請(qǐng)求HTML頁(yè)面的URL地址
  • data:Object    發(fā)送至服務(wù)器的key/value數(shù)據(jù)
  • callback:Function    請(qǐng)求完成時(shí)的回調(diào)函數(shù),無(wú)論請(qǐng)求成功或失敗
[javascript] view plain copy
  1. $(function(){  
  2.     $("#send").click(function(){  
  3.         $("#resText").load("test.html");  
  4.     })  
  5. })  
[javascript] view plain copy
  1. <button type="button" id="send">ajax加載</button>  
  2. <div class="comment">已有評(píng)論:</div>  
  3. <div id="resText">替換內(nèi)容</div>  

test.html代碼為:

[javascript] view plain copy
  1. <div class="comment">  
  2.     <h6>張三:</h6>  
  3.     <p class="para">沙發(fā)</p>  
  4. </div>  
  5. <div class="comment">  
  6.     <h6>李四:</h6>  
  7.     <p class="para">板凳</p>  
  8. </div>  
  9. <div class="comment">  
  10.     <h6>王五:</h6>  
  11.     <p class="para">地板</p>  
  12. </div>  

篩選載入的HTML文檔

load()方法的URL參數(shù)的語(yǔ)法結(jié)構(gòu)為:“url selector”

[javascript] view plain copy
  1. $("#resText").load("test.html .para");  

load()傳遞方式根據(jù)參數(shù)data自動(dòng)指定,沒(méi)有參數(shù) --> GET,反之為POST   

[javascript] view plain copy
  1. // 無(wú)參數(shù)傳遞 GET  
  2. $("#resText").load("test.html",function(){  
  3.     //code  
  4. });  
  5. // 有參數(shù)傳遞 POST  
  6. $("#resText").load("test.html",{name:"rain",age:"22"},function(){  
  7.     //code  
  8. });  

回調(diào)函數(shù):有三個(gè)參數(shù),請(qǐng)求返回的內(nèi)容、請(qǐng)求狀態(tài)、XMLHttpRequest對(duì)象

[javascript] view plain copy
  1. // 回調(diào)函數(shù)  
  2. $("#resText").load("test.html",function(responseText,textStatus,XMLHttpRequest){  
  3.     //responseText  請(qǐng)求返回的內(nèi)容  
  4.     //textStatus    請(qǐng)求狀態(tài):success、error、notmodified、timeout  
  5.     //XMLHttpRequest    XMLHttpRequest對(duì)象  
  6. });  

2、$.get()和$.post()方法    jQuery中的全局函數(shù)

2.1 $.get()    使用GET方式來(lái)進(jìn)行異步請(qǐng)求

[javascript] view plain copy
  1. $.get(url[,data][,callback][,type]);  
  • url:String    請(qǐng)求HTML頁(yè)面的URL地址
  • data:Object    發(fā)送至服務(wù)器的key/value數(shù)據(jù)會(huì)作為QueryString附加到請(qǐng)求URL中
  • callback:Function    載入成功時(shí)回調(diào)函數(shù)(只有當(dāng)response的返回狀態(tài)是success才調(diào)用該函數(shù))自動(dòng)將請(qǐng)求結(jié)果和狀態(tài)傳遞給該方法
  • type:服務(wù)器返回內(nèi)容的格式,包括html、xml、script、json、text、_default
[javascript] view plain copy
  1. $("#send").click(function(){  
  2.     $.get("get1.php",{  
  3.         username:$("#username").val(),  
  4.         content:$("#comment").val()  
  5.     },function(data,textStatus){  
  6.         // data:返回的內(nèi)容  
  7.         // textStatus:請(qǐng)求狀態(tài),success、error、notmodified、timeout  
  8.     })  
  9. })  

數(shù)據(jù)格式:服務(wù)器返回的數(shù)據(jù)格式

(1)HTML片段    較少工作量

[javascript] view plain copy
  1. $.get("get1.php",{  
  2.     username:$("#username").val(),  
  3.     content:$("#comment").val()  
  4. },function(data,textStatus){  
  5.     // data:返回的內(nèi)容  
  6.     // textStatus:請(qǐng)求狀態(tài),success、error、notmodified、timeout  
  7.     $("#resText").html(data);   //將返回的數(shù)據(jù)添加到頁(yè)面上  
  8. });  

(2) XML文檔    需要對(duì)返回的數(shù)據(jù)處理

方便使用

可以通過(guò)attr()、find()、filter()方法對(duì)數(shù)據(jù)進(jìn)行處理

[javascript] view plain copy
  1. $("#send").click(function(){  
  2.     $.get("get1.php", {   
  3.         username :  $("#username").val() ,   
  4.         content :  $("#content").val()    
  5.     }, function (data, textStatus){  
  6.         var username = $(data).find("comment").attr("username");  
  7.         var content = $(data).find("comment content").text();  
  8.         var txtHtml = "<div class='comment'><h6>"+username  
  9.                     +":</h6><p class='para'>"+content+"</p></div>";  
  10.         $("#resText").html(txtHtml); // 把返回的數(shù)據(jù)添加到頁(yè)面上  
  11.     });  
  12. })  
由于期待服務(wù)器返回的數(shù)據(jù)類型為XML文檔,因此需要在服務(wù)期端設(shè)置Content-Type類型
[javascript] view plain copy
  1. header("Content-Type:text/html; charset=utf-8");  

(3)JSON文件    需要對(duì)返回的數(shù)據(jù)處理

JSON相對(duì)于XML比較簡(jiǎn)潔

[javascript] view plain copy
  1. $("#send").click(function(){  
  2.     $.get("get3.php", {   
  3.         username :  $("#username").val() ,   
  4.         content :  $("#content").val()    
  5.     }, function (data, textStatus){  
  6.         var username = data.username;  
  7.         var content = data.content;  
  8.         var txtHtml = "<div class='comment'><h6>"+username  
  9.                     +":</h6><p class='para'>"+content+"</p></div>";  
  10.         $("#resText").html(txtHtml); // 把返回的數(shù)據(jù)添加到頁(yè)面上  
  11.     },"json");  
  12. })  

以上三種方法對(duì)比:

HTML返回?cái)?shù)據(jù)最簡(jiǎn)單,如果數(shù)據(jù)需要重用使用JSON(性能與文件大小方面有優(yōu)勢(shì)),當(dāng)遠(yuǎn)程程序未知時(shí)使用XML。

2.2 $.post()    通過(guò) HTTP POST 請(qǐng)求從服務(wù)器上請(qǐng)求數(shù)據(jù)

[javascript] view plain copy
  1. $.post(URL[,data][,callback]);  
  • url:String    請(qǐng)求的URL地址
  • data:Object    發(fā)送至服務(wù)器的key/value數(shù)據(jù)
  • callback:Function    載入成功時(shí)的回調(diào)函數(shù)

由于POST和GET方式提交的所有數(shù)據(jù)都可以通過(guò)$_REQUEST[]來(lái)獲取,因此只需要改變jQuery函數(shù),就可以將程序在GET請(qǐng)求和POST請(qǐng)求之間切換。

當(dāng)load()方法帶有參數(shù)傳遞時(shí),會(huì)使用POST方式發(fā)送請(qǐng)求。因此也可以使用load()方法來(lái)完成同樣的功能。

$.post()與$.get()方法的區(qū)別:
  • GET請(qǐng)求會(huì)將參數(shù)跟在URL后進(jìn)行傳遞,而POST請(qǐng)求則是作為HTTP消息的實(shí)體內(nèi)容發(fā)送給Web服務(wù)器。當(dāng)然,在Ajax請(qǐng)求中,這種區(qū)別對(duì)用戶是不可見(jiàn)的。
  • GET方式對(duì)傳輸?shù)臄?shù)據(jù)有大小限制(通常不能大于2KB),而使用POST方式傳遞的數(shù)據(jù)量要比GET方式大得多(理論上不受限制)。
  • GET方式請(qǐng)求的數(shù)據(jù)會(huì)被瀏覽器緩存起來(lái),因此其他人就可以從瀏覽器的歷史記錄中讀取到這些數(shù)據(jù),例如賬號(hào)和密碼等。在某種情況下,GET方式會(huì)帶來(lái)嚴(yán)重的安全性問(wèn)題,而POST方式相對(duì)來(lái)說(shuō)就可以避免這些問(wèn)題。
  • GET方式和POST方式傳遞的數(shù)據(jù)在服務(wù)器端的獲取也不相同。在PHP中,GET方式的數(shù)據(jù)可以用$_GET[]獲取,而POST方式可以用$_POST[]獲取。兩種方式都可以用$_REQUEST[]來(lái)獲取。

      上面使用load()、$.get()和$.post()方法完成了一些常規(guī)的Ajax程序,如果還需要編寫一些復(fù)雜的Ajax程序,那么就要用到j(luò)Query中的$.ajax()方法。$.ajax()方法不僅能實(shí)現(xiàn)與load()、$.get()和$.post()方法同樣的功能,而且還可以設(shè)定beforeSend(提交前回調(diào)函數(shù))、error(請(qǐng)求失敗后處理)、success(請(qǐng)求成功后處理)以及complete(請(qǐng)求完成后處理)回調(diào)函數(shù),通過(guò)這些回調(diào)函數(shù),可以給用戶更多的Ajax提示信息。另外,還有一些參數(shù),可以設(shè)置Ajax請(qǐng)求的超時(shí)時(shí)間或者頁(yè)面的“最后更改”狀態(tài)等。

3、$.getScript()和$.getJSON()方法

3.1 $.getScript()

有時(shí)候,在頁(yè)面初次加載時(shí)就取得所需的全部JavaScript文件是完全沒(méi)有必要的。雖然可以在需要哪個(gè)JavaScript文件時(shí),動(dòng)態(tài)地創(chuàng)建<script>標(biāo)簽

[javascript] view plain copy
  1. $(document.createElement("script").attr("src","test.js")).appenChild("head");  
  2. //或  
  3. $("<script type='text/javscript' src='test.js'></script>").appendChild("head");  
上述方法不理想,jQuery又提供了$.getScript()方法
[javascript] view plain copy
  1. $(function(){  
  2.     $("#btn").click(function(){  
  3.         $.getScript("test.js");  
  4.     })  
  5. })  
有回調(diào)函數(shù)
[javascript] view plain copy
  1. $.getScript("test.js",function(){  
  2.     $(element).click(function(){  
  3.         $(element).animate({backgroundcolor:'pink'},1000)  
  4.         .animate({backgroundcolor:'coral'},1000);  
  5.     })  
  6. });  

3.2 $.getJSON()方法    用于加載JSON文件,用法同$.getScript()方法

[javascript] view plain copy
  1. $(function(){  
  2.     $("#btn").click(function(){  
  3.         $.getJSON("test.json");  
  4.     })  
  5. })  

上面函數(shù)雖然加載了JSON代碼,但是并沒(méi)有告訴JS對(duì)返回的數(shù)據(jù)如何處理,所以需要回調(diào)函數(shù)

[javascript] view plain copy
  1. $(function(){  
  2.     $("#btn").click(function(){  
  3.         $.getJSON("test.json",function(){  
  4.             //data:返回的數(shù)據(jù)  
  5.         });  
  6.     })  
  7. })  

jQuery遍歷方法  -->  $.each()方法    遍歷對(duì)象和數(shù)組

$.each(data,callback)    // 為全局函數(shù)   不同于each()方法

  • data:數(shù)組或?qū)ο?
  • callback:回調(diào)函數(shù),有兩個(gè)參數(shù)(對(duì)象的成員或數(shù)組的索引,對(duì)應(yīng)變量或內(nèi)容)

4、$.ajax()方法    jQuery最底層的Ajax實(shí)現(xiàn)

$.ajax(options);

參數(shù)名稱  類型  說(shuō)明
url String (默認(rèn)為當(dāng)前頁(yè)地址)發(fā)送請(qǐng)求的地址
type String

 請(qǐng)求方式(POST/GET)默認(rèn)GE

注意其他HTTP請(qǐng)求方法,例如PUT和DELETE,僅部分瀏覽器支持

timeout Number

 設(shè)置請(qǐng)求超時(shí)時(shí)間(毫秒)

此設(shè)置將覆蓋$.ajaxSetup()方法的全局設(shè)置

data Object/String

 發(fā)送到服務(wù)器的數(shù)據(jù)。如果已經(jīng)不是字符串,將自動(dòng)轉(zhuǎn)換為字符串格式。

GET請(qǐng)求中將附加在URL后。防止這種自動(dòng)轉(zhuǎn)換,可以查看processData選項(xiàng)。

對(duì)象必須為key/value格式

    例如:{foo1:"bar1",foo2:"bar2"}轉(zhuǎn)換為&foo1=bar1&foo2=bar2。

如果是數(shù)組,jQuery將自動(dòng)為不同的值對(duì)應(yīng)同一個(gè)名稱

    例如:{foo:["bar1","bar2"]}轉(zhuǎn)換為&foo=bar1&foo=bar2

dataType String

預(yù)期服務(wù)器返回的數(shù)據(jù)類型。

如果不指定,jQuery將自動(dòng)根據(jù)HTTP包MIME信息返回responseXML或responseText,

并作為回調(diào)函數(shù)參數(shù)傳遞。

可用類型,

xml:返回XML文檔,可用jQuery處理

html:返回純文本HTML信息,包含的script標(biāo)簽會(huì)在插入DOM是執(zhí)行

script:返回純文本的JavaScript代碼,不會(huì)自動(dòng)緩存結(jié)果。除非設(shè)置cache參數(shù)

            注意在遠(yuǎn)程請(qǐng)求時(shí)(不在同一個(gè)域下),所有POST請(qǐng)求都將轉(zhuǎn)換為GET請(qǐng)求

json:返回json數(shù)據(jù)

jsonp:jsonp格式,使用jsonp形式調(diào)用參數(shù)時(shí),myurl?callback=?

jQuery:將自動(dòng)替換后一個(gè)“?”為正確的函數(shù)名,以執(zhí)行回調(diào)函數(shù)

text:返回純文本字符串

beforeSend Function

發(fā)送請(qǐng)求前可以修改XMLHttpRequest對(duì)象的函數(shù)例如添加自定義HTTP頭。

在beforeSend中如果返回false可以取消本次Ajax請(qǐng)求。XMLHttpRequest對(duì)象是唯一的函數(shù)

function(XMLHttpRequest){

    this;//調(diào)用本次Ajax請(qǐng)求時(shí)傳遞的options參數(shù)

}

complete Function

 請(qǐng)求完成后調(diào)用的函數(shù)(請(qǐng)求成功或失敗時(shí)均調(diào)用)

參數(shù):XMLHttpRequest對(duì)象和一個(gè)描述成功請(qǐng)求類型的字符串

function(XMLHttpRequest,textStatus){

    this;//調(diào)用本次Ajax請(qǐng)求時(shí)傳遞的options參數(shù)

}

success Function

請(qǐng)求完成后調(diào)用的函數(shù)(請(qǐng)求成功或失敗時(shí)均調(diào)用)

參數(shù):(1) 由服務(wù)器返回,并根據(jù)datatype參數(shù)進(jìn)行設(shè)置

           (2) 描述狀態(tài)的字符串

function(XMLHttpRequest,textStatus){

    //data可能是XMLDoc、jsonObj、html、text等

    this;//調(diào)用本次Ajax請(qǐng)求時(shí)傳遞的options參數(shù)

}

error Function

 請(qǐng)求失敗時(shí)被調(diào)用的函數(shù)

參數(shù):(1) XMLHttpRequest對(duì)象

           (2) 錯(cuò)誤信息

           (3) 捕獲的錯(cuò)誤對(duì)象(可選)

function(XMLHttpRequest,textStatus,errorThrown){

    //通常情況下textStatus和errorThrown只有其中一個(gè)包含信息

    this;//調(diào)用本次Ajax請(qǐng)求時(shí)傳遞的options參數(shù)

}

global Boolean

 默認(rèn)為true。表示是否觸發(fā)全局Ajax事件。設(shè)置為false將不會(huì)觸發(fā)全局Ajax事件

AjaxStart或AjaxStop可用于控制各種Ajax事件

前面用到的$.load()、$.get()、$.post()、$.getScript()和$.getJSON()這些方法,都是基于$.ajax()方法構(gòu)建的,$.ajax()方法是jQuery最底層的Ajax實(shí)現(xiàn),因此可以用它來(lái)代替前面的所有方法。

[javascript] view plain copy
  1. $(function(){  
  2.     $("#btn").click(function(){  
  3.         $.getScript("test.js");  
  4.     })  
  5. })  

可被替換為

[javascript] view plain copy
  1. $(function(){  
  2.     $("#btn").click(function(){  
  3.         $.ajax({  
  4.             type:"GET",  
  5.             url:"test.js",  
  6.             dataType:"script"  
  7.         });  
  8.     });  
  9. })  
[javascript] view plain copy
  1. $(function(){  
  2.     $("#btn").click(function(){  
  3.         $.getJSON("test.json",function(data){  
  4.                 $("#resText").empty();  
  5.                 var html = " ";  
  6.                 $.each(data,function(commentIndex,comment){  
  7.                     html+='<div class="comment"><h6>'+comment['username']  
  8.                          +'</h6><p class="para">'+comment['content']  
  9.                          +'</p></div>'  
  10.                 })  
  11.                 $("resText").html(html);  
  12.             }  
  13.         });  
  14.     });  
  15. })  

可被替換為

[javascript] view plain copy
  1. $(function(){  
  2.     $("#btn").click(function(){  
  3.         $.ajax({  
  4.             type:"GET",  
  5.             url:"test.json",  
  6.             dataType:"json",  
  7.             success:function(data){  
  8.                 $("#resText").empty();  
  9.                 var html = " ";  
  10.                 $.each(data,function(commentIndex,comment){  
  11.                     html+='<div class="comment"><h6>'+comment['username']  
  12.                          +'</h6><p class="para">'+comment['content']  
  13.                          +'</p></div>'  
  14.                 })  
  15.                 $("resText").html(html);  
  1. })
} }); });
三、序列化元素

1.serialize()方法

異步提交表單,并將服務(wù)器返回的數(shù)據(jù)顯示到當(dāng)前頁(yè)面中

[javascript] view plain copy
  1. $.get("get1.php",{  
  2.     username:$("#username").val(),  
  3.     content:$("#comment").val()  
  4. },function(data,textStatus){  
  5.     // data:返回的內(nèi)容  
  6.     // textStatus:請(qǐng)求狀態(tài),success、error、notmodified、timeout  
  7.     $("#resText").html(data);   //將返回的數(shù)據(jù)添加到頁(yè)面上  
  8. });  

serialize()方法也是作用于一個(gè)jQuery對(duì)象,它能夠?qū)OM元素內(nèi)容序列化為字符串,用于Ajax請(qǐng)求??蓪⑸鲜龃a簡(jiǎn)化為:

[javascript] view plain copy
  1. $.get("get1.php",$("#form1").serialize(),function(data,textStatus){  
  2.     // data:返回的內(nèi)容  
  3.     // textStatus:請(qǐng)求狀態(tài),success、error、notmodified、timeout  
  4.     $("#resText").html(data);   //將返回的數(shù)據(jù)添加到頁(yè)面上  
  5. });  

serialize()方法作用于jQuery對(duì)象,所以不光只有表單能使用它,其他選擇器選取的元素也都能使用它,如以下jQuery代碼:

[javascript] view plain copy
  1. $(":checkbox,:radio").serialize();  

把復(fù)選框和單選框的值序列化為字符串形式,只會(huì)將選中的值序列化。

2.serializeArray()方法

該方法不是返回字符串,而是將DOM元素序列化后,返回JSON格式的數(shù)據(jù)

3.$.param()方法

它是serialize()方法的核心,用來(lái)對(duì)一個(gè)數(shù)組或?qū)ο蟀凑誯ey/value進(jìn)行序列化。

比如將一個(gè)普通的對(duì)象序列化:

四、jQuery中的全局事件

jQuery簡(jiǎn)化Ajax操作不僅體現(xiàn)在調(diào)用Ajax方法和處理響應(yīng)方面,而且還體現(xiàn)在對(duì)調(diào)用Ajax方法的過(guò)程中的HTTP請(qǐng)求的控制。通過(guò)jQuery提供的一些自定義全局函數(shù),能夠?yàn)楦鞣N與Ajax相關(guān)的事件注冊(cè)回調(diào)函數(shù)。例如當(dāng)Ajax請(qǐng)求開(kāi)始時(shí),會(huì)觸發(fā)ajaxStart()方法的回調(diào)函數(shù);當(dāng)Ajax請(qǐng)求結(jié)束時(shí),會(huì)觸發(fā)ajaxStop()方法的回調(diào)函數(shù)。這些方法都是全局的方法,因此無(wú)論創(chuàng)建它們的代碼位于何處,只要有Ajax請(qǐng)求發(fā)生時(shí),就會(huì)觸發(fā)它們。

有時(shí),當(dāng)網(wǎng)頁(yè)加載過(guò)慢時(shí),就需要為網(wǎng)頁(yè)添加一個(gè)提示信息,常用的提示信息是“加載中…”,代碼如下:

[javascript] view plain copy
  1. <div class="loading">加載中...</div>  
然后通過(guò)CSS控制元素隱藏,當(dāng)Ajax請(qǐng)求開(kāi)始的時(shí)候,將此元素顯示,用來(lái)提示用戶Ajax請(qǐng)求正在進(jìn)行。當(dāng)Ajax請(qǐng)求結(jié)束后,將此元素隱藏。
[javascript] view plain copy
  1. $("$loading").ajaxStart(function(){  
  2.     $(this).show();  
  3. }).ajaxStop(function(){  
  4.     $(this).hide();  
  5. });  

jQuery的Ajax全局事件中還有幾個(gè)方法,也可以在使用Ajax方法的過(guò)程中為其帶來(lái)方便。


方法名稱  說(shuō)明
ajaxComplete(callback) Ajax請(qǐng)求完成時(shí)執(zhí)行的函數(shù)
ajaxError(callback) Ajax請(qǐng)求發(fā)生錯(cuò)誤時(shí)執(zhí)行的函數(shù),捕捉到的錯(cuò)誤可以作為最后一個(gè)參數(shù)傳遞
ajaxSend(callback) Ajax請(qǐng)求發(fā)送前執(zhí)行的函數(shù)
ajaxSuccess(callback) Ajax請(qǐng)求成功時(shí)執(zhí)行的函數(shù)

注意:

1,如果想使某個(gè)Ajax請(qǐng)求不受全局方法的影響,那么可以在使用$.ajax(options)方法時(shí),將參數(shù)中的global設(shè)置為false,jQuery代碼如下

[javascript] view plain copy
  1. $.ajax({  
  2.     url:"test.html",  
  3.     global:false  
  4. });  

2,在jQuery1.5版本之后,如果Ajax請(qǐng)求不觸發(fā)全局方法,那么可以設(shè)置:


[javascript] view plain copy
  1. $.ajaxPrefilter(function(options){  
  2.     options.global = true;  
  3. })  

藍(lán)藍(lán)設(shè)計(jì)m.yvirxh.cn )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國(guó)內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 平面設(shè)計(jì)服務(wù)




日歷

鏈接

個(gè)人資料

存檔