1. 程式人生 > >jQuery 對Ajax的支援——從Ajax基本實現到jQuery對Ajax的封裝

jQuery 對Ajax的支援——從Ajax基本實現到jQuery對Ajax的封裝

jQueryAjax的支援

在學習這塊之前先得了解下Ajax

一、Ajax

——Asynchronous JavaScript And XML

Ajax不是一種框架,而是多種技術組合而成的一種整體。主要用於非同步更新網頁內容。通過與後臺的資料交換,Ajax可以只更新網頁的部分內容而不會重新載入整個頁面。

在學習jQueryAjax的支援之前,先了解下Ajax的原始實現。

結合程式碼說明起來比較方便:

ajaxtest.html:

<!DOCTYPEhtml PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>垂直居中</title>
 
<scriptsrc="http://cdn.static.runoob.com/libs/jquery/2.1.1/jquery.min.js"></script>
<scriptsrc="js/tempjs.js"></script>
<script>
 
functionajaxTest(id){
   //步驟一
   var xmlhttp = new XMLHttpRequest();
   //步驟二
   xmlhttp.onreadystatechange = function(){
      if(xmlhttp.readyState==4 &&xmlhttp.status==200){
         $(id).html(xmlhttp.responseText);
      }
   }
   //步驟三
   xmlhttp.open("GET","ajax/test.txt",true);
   xmlhttp.send();
}
</script>
 
<styletype="text/css">
#div_parent{
margin:100px50px 0px 50px;border:2px solid black;height:400px;border-radius:15px;
}
#div_child{
height:60px;width:130px;border:2pxsolid black;border-radius:15px;margin:0px auto;
}
</style>
</head>
<body>
<divid="div_parent" >
<buttononclick="ajaxTest('#div_child')">change</button>
<divid="div_child" >
<p>changetext</p>
</div>
</div>
</body>
</html>
 

按下按鈕將會呼叫"ajax/test.txt"中的內容,原內容將被修改。

實現Ajax有幾個步驟:

1、獲取XMLHttpRequest物件(如果是上古時代的瀏覽器,如ie5,則應該獲取ActiveXObject,這裡不討論它)

var xmlhttp =new XMLHttpRequest();

2、為XMLHttpRequest物件配置屬性

XMLHttpRequest物件一共有三個屬性:onreadystatechange(全小寫)readyStatestatus

2.1onreadystatechange

onreadystatechange屬性設定方法。

xmlhttp.onreadystatechange = function(){
//方法內容
};

每次readyState物件的改變都會觸發一次onreadystatechange屬性儲存的函式,一次有效的Ajax請求一共會觸發5次該事件。

2.2readyState

一共有5個值,0~4分別代表不同的狀態。

0  ——    請求未初始化

1  ——    伺服器已建立了連結

2  ——    請求已被伺服器接收

3  ——    請求正在被處理

4  ——    請求完成處理,響應就緒

上面的程式中,通過以下程式碼即可判斷出當前伺服器是否已準備好響應

if(xmlhttp.readyState==4…)

2.3Status

代表著Http狀態碼,例如401404200……

在上面的程式中,通過以下程式碼即可判斷出伺服器是否已準備響應且響應正常。

if(xmlhttp.readyState==4&& xmlhttp.status==200)

2.4:獲取伺服器響應內容

上述程式中的:$(id).html(xmlhttp.responseText)。這段程式為被傳入的元素設定了一段html資訊。

響應分為兩種:

responseText / responseXML

前者針對於一般的檔案資料,後者針對Xml檔案,獲取後需要在Js指令碼中解析一下,以抓取需要的資訊。

3、傳送請求open()/send()

對應上邊的:

  xmlhttp.open("GET","ajax/test.txt",true);
   xmlhttp.send();
 

API

3.1 open()

xmlhttp.open(method,url,async);

method:請求方法,分為GET/POST,具體的區別參照Http協議。

url:請求的url,可以把請求引數加進去

async:是否採用非同步模式,使用Ajax時一定要設為true

當設定為false,務必確認該請求是一個不太耗時的小型請求,且不再需要為onreadystatechange屬性設定函式:

     xmlhttp.open("POST","ajax/test.txt",false);
   xmlhttp.send();
$(id).html(xmlhttp.responseText);

3.2 send():

xmlhttp.send(String);

用於傳送請求資料,相當於是url?的後面部分,在methodGET的時候一般直接在open方法裡邊修改url

只有在methodPOST的時候才能為send()傳入引數,且傳入引數時時,必須通過XMLHttpRequest.setRequestHeadersend中的資料設定型別

二、jQuery中的Ajax

這裡僅列出了三個基本的方法

1jQuery.ajax()

$.ajax([setting]);

這是比較通用的方法。

直接給ajax傳入各種引數以設定整個ajax的行為。

2jQuery.load() / jQuery.post() / jQuery.get()

這三個方法進行了進一步的封裝,簡化了操作

2.1 jQuery.load(url[,data][,complete])

用於從伺服器載入資料併為目標元素設定返回資料

url是必選的,data可以傳入一些鍵-值對的請求引數,complete是一個回撥方法,主要可以對返回結果進行一些處理。例如:

function ajaxTest(id){
   $(id).load("ajax/test.txt",function(response,status,xmlhttp){
         alert("返回的文字為:"+response);
      });
}

其中response封裝了返回的資料,status包含了呼叫的狀態,xmlhttp封裝了該次請求的XMLHttpRequest

以上指令碼將直接對元素‘id’新增一段從test.txt中獲取的html文字

url是必選的。採用GET方法請求。

data:和load()中的一樣,用於傳入一些請求引數,但實際上請求方法為GET時,一般直接在url中追加引數。

success:是成功後的回撥方法。一般寫為:function(response,status,xmlhttp){},其引數作用和load中的complete類似。

dataType:返回資料的型別,jQuery預設進行智慧判斷。一個例項:

function ajaxTest(id){
   $.get("ajax/test.txt",function(response,status,xmlhttp){
         $(id).html(response);
         alert("返回的文字為: "+response);
      });
}

以上例項和2.1中的程式碼段將實現同樣的效果

2.3 jQuery.post(url[,data][,success][,dataType])

url是必選的。採用POST方法請求。

data:傳入請求引數。

success:成功後的回撥方法,該方法和get()中的回撥方法基本相同。

datatype:同get()中的datatype。一個例項:

同樣和2.12.2的例項有相同的效果。
function ajaxTest(id){
$.post("ajax/test.txt",{time:"2018",name:"tom"},function(response,status,xmlhttp){
         $(id).html(response);
         alert("返回的文字為:"+response+"status: "+status);
      });
}

實際上這裡傳入的請求引數,{time:"2018",name:"tom"},並沒有起作用,只是記錄一下該引數的格式。另外,傳入陣列的格式應該是:{ 'choices[]':[ "Jon","Susan"] }