Ajax非同步回調機制__Ajax

來源:互聯網
上載者:User

什麼是Ajax。   

 

Ajax即"Asynchronous javascript and XML”(非同步JavaScript和XML),是一種建立互動式網頁應用的Web開發技術。

主要包含了以下幾種技術:

        .基於web標準(standards-based presentation)XHTML+CSS的表示;

        .使用 DOM(Document Object Model)進行動態顯示及互動;

        .使用 XML 和 XSLT 進行資料交換及相關操作;

        .使用 XMLHttpRequest 進行非同步資料查詢、檢索;

        .使用 JavaScript 將所有的東西綁定在一起。

 

Ajax的兩項強大效能:

        .無需重新裝載整個頁面便能向伺服器發送請求。            

        .對XML文檔的解析和處理。

 

步驟 1 – "請!" --- 如何發送一個HTTP請求

 

(1)為了用JavaScript向伺服器發送一個HTTP請求, 需要一個具備這種功能的類執行個體. 這樣的類首先由Internet Explorer以ActiveX對象引入, 被稱為XMLHTTP 。

後來Mozilla, Safari 和其他瀏覽器紛紛仿效, 提供了XMLHttpRequest 類,它支援微軟的ActiveX對象所提供的方法和屬性。

 

因此, 為了建立一個跨瀏覽器的這樣的類執行個體(對象), 可以應用如下代碼:

    

 if (window.XMLHttpRequest) { // Mozilla, Safari, ... 

http_request = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
http_request = new ActiveXObject( " Microsoft.XMLHTTP " );
}

(上例對代碼做了一定簡化,這是為瞭解釋如何建立XMLHTTP類執行個體. 實際的代碼執行個體可參閱本篇步驟3.)

 

(2)如果伺服器的響應沒有XML mime-type header,某些Mozilla瀏覽器可能無法正常工作。 為瞭解決這個問題, 如果伺服器響應的header不是text/xml ,

可以調用其它方法修改該header。

 

 http_request = new XMLHttpRequest();

http_request.overrideMimeType( ' text/xml ' );

 

 (3)接下來要決定當收到伺服器的響應後,需要做什麼。這需要告訴HTTP請求對象用哪一個JavaScript函數處理這個響應。

可以將對象的onreadystatechange 屬性設定為要使用的JavaScript的函數名,如下所示:

 

 http_request.onreadystatechange = nameOfTheFunction; 

 注意:在函數名後沒有括弧,也無需傳遞參數.另外還有一種方法,可以定義函數及其對響應要採取的行為,如下所示: 

 

 http_request.onreadystatechange = function(){

// do the thing
};

 

(4)在定義了如何處理響應後,就要發送請求了.可以調用HTTP請求類的open() 和send() 方法, 如下所示:

 

 http_request.open( ' GET ' , ' http://www.example.org/some.file ' , true );

http_request.send( null );

.open() 的第一個參數是HTTP請求方式 – GET, POST, HEAD 或任何伺服器所支援的您想調用的方式。

按照HTTP規範,該參數要大寫;否則,某些瀏覽器(如Firefox)可能無法處理請求。

.第二個參數是請求頁面的URL。由於自身安全特性的限制,該頁面不能為第三方網域名稱的頁面。同時一定要保證在所有的頁面中都使用準確的網域名稱,

否則調用open()會得到"permission denied"的錯誤提示。一個常見的錯誤是訪問網站時使用domain.tld,而當請求頁面時,卻使用www.domain.tld 。

.第三個參數佈建要求是否為非同步模式。如果是TRUE , JavaScript函數將繼續執行,而不等待伺服器響應。這就是"AJAX"中的"A"。

 

如果第一個參數是"POST",send() 方法的參數可以是任何想送給伺服器的資料。 這時資料要以字串的形式送給伺服器,如下所示:

 

 name = value & anothername = othervalue & so = on 

 如果第一個參數是”GET”,send()方法的參數為null。

 

步驟 2 – "收到!" --- 處理伺服器的響應

 

當發送請求時,要提供指定處理響應的JavaScript函數名。

 

 http_request.onreadystatechange = nameOfTheFunction; 

 

 

(1)我們來看看這個函數的功能是什麼。首先函數會檢查請求的狀態。如果狀態值是4,就意味著一個完整的伺服器響應已經收到了,您將可以處理該響應。

 

 if (http_request.readyState == 4 ) {

// everything is good, the response is received
} else {
// still not ready
}

readyState 的取值如下:

0(未初始化)  1(正在裝載)  2(裝載完畢)  3(互動中)  4(完成)

 

(2)接著,函數會檢查HTTP伺服器響應的狀態值。我們著重看值為200 OK 的響應。

 

 if (http_request.status == 200 ) {

// perfect!
} else {
// there was a problem with the request,
// for example the response may be a 404 (Not Found)
// or 500 (Internal Server Error) response codes
}

 

 

(3)在檢查完請求的狀態值和響應的HTTP狀態值後, 您就可以處理從伺服器得到的資料了。有兩種方式可以得到這些資料:

          .http_request.responseText – 以文本字串的方式返回伺服器的響應

          .http_request.responseXML – 以XMLDocument 對象方式返迴響應。處理XMLDocument 對象可以用JavaScript DOM函數

 

步驟 3 – "萬事俱備!" - 簡單一實例

 

附一個簡單完整的非同步回呼函數makeRequest(url, functionName, httpType, sendData):

 

 // AJAX的POST請求 

// 定義XMLHttpRequest對象執行個體
var http_request = false ;
/* ************************************************************************
* 方法說明:可複用的http請求發送函數
* 參數說明:
* url:目標URL
* functionName:要回調的函數
* httpType:請求方式(GET/POST)
* sendData:用POST方式發出請求時想傳給伺服器的資料,
*      資料以查詢字串的方式列出,如:name=value&anothername=othervalue。
*      若用GET方式:請傳null
************************************************************************ */
function makeRequest(url, functionName, httpType, sendData) {

http_request = false ;
if ( ! httpType) httpType = " GET " ;

if (window.XMLHttpRequest) { // Non-IE...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType( ' text/xml ' );
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject( " Msxml2.XMLHTTP " );
} catch (e) {
try {
http_request = new ActiveXObject( " Microsoft.XMLHTTP " );
} catch (e) {}
}
}

if ( ! http_request) {
alert( ' Cannot send an XMLHTTP request ' );
return false ;
}

http_request.onreadystatechange = functionName;
http_request.open(httpType, url, true );
http_request.setRequestHeader( ' Content-Type ' , ' application/x-www-form-urlencoded ' );
http_request.send(sendData);
}

 

(1)我們現在將整個過程完整地做一次,發送一個HTTP請求。我們在用戶端OrderDelivery.js用JavaScript請求一個OrderDelivery.ashx伺服器檔案

 

 function EnterProductBarCode(orderGoodsId,orderNumber){

......
var requestUrl = " ../JavaScript/OrderDelivery.ashx?function=EnterProductBarCode&OrderGoodsID= " + orderGoodsId + " &OrderNumber= " + orderNumber + " &ProductBarCode= " + productBarCode;
makeRequest(requestUrl,EnterProductBarCodeBack, " POST " , null );
}

 

(2)OrderDelivery.ashx收到requestUrl, 並根據function參數的值,執行相應的函數。執行完畢,返回資料給用戶端的回呼函數。

 

 public void ProcessRequest (HttpContext context) {

string function = context.Request.Params[ " function " ];
try {
if (function == " EnterProductBarCode " ){
context.Response.Write(...這裡返回資料給用戶端的回呼函數...);
return ;
}
if (...){......}
}
catch (Exception e)
{
context.Response.Write(e.Message);
}
}

 

(3)用戶端OrderDelivery.js的回呼函數EnterProductBarCodeBack使用http_request.responseText擷取伺服器端返回的資料。並進行處理。

 

 function EnterProductBarCodeBack(){

var str = http_request.responseText;
if (http_request.readyState == 4 ) {
if (http_request.status == 200 ) {
...處理str...
}
}
}

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.