XMLHTTP對象封裝技術

來源:互聯網
上載者:User
 

Ajax技術的實現主要依賴於xmlhttprequest,但我們在調用其來進行非同步資料的傳輸時,由於xmlhttp是個短線過程(處理事件完成後就銷毀)
如果不對該對象進行封裝處理的話,就不得不在需要調用的地方重新構建xmlhttprequest,每次調用都要寫一大段的代碼,實在不是個好辦法。
好在現在很多開源的ajax架構都提供了對xmlhttp封裝的方案。這裡以ajaxtags內建的prototype-1.4.0.js為母片,來看看如何將xmlhttp對象封裝成一個可複用的方法。

在prototype.js中,首先定義了一個變數:Ajax
var Ajax = {
getTransport: function()
{
return Try.these(
function() {return new ActiveXObject('Msxml2.XMLHTTP')},
function() {return new ActiveXObject('Microsoft.XMLHTTP')},
function() {return new XMLHttpRequest()}
) || false;
},

activeRequestCount: 0
}
變數返回了一個xmlhttprequest,可以看到,如果我們調用了Ajax.getTransport(),每次都會返回一個新的xmlhttprequest對象。
在Ajax變數中定義了一個基礎方法Ajax.Base和該基礎方法的原型(初始時,每個指令碼方法預設都有個空的原型,該原型會繼承Object的原型,如果我們在Object中改變了原型,則所有的指令碼方法都會被改變。) 該基礎方法被Ajax.Request所繼承,注意的是,如果在Ajax.Request中填充了繼承的原型的同名方法或變數,則會實現重載。
Ajax.Base原型中最主要的是setOptions方法,過會我們就會用到。
setOptions: function(options)
{
this.options = {
method: 'post',
asynchronous: true,
parameters: ''
}
prototype中對request是通過定義Ajax.Request原型(Ajax.Request.prototype)來實現的。但我們並不能直接對Ajax.Request進行調用,主要原因是Ajax.Request並沒有提供一個統一處理的過程。而且我們可能需要通過request 再取得response。(試想一下,客戶那邊發出一條資訊,都始終沒與收到回複,那是會讓人覺得很惱火的事~),prototype同樣為我們封裝好了resoponse(Ajax.Responders),但兩者都是相互獨立的,如何把他們進行整合呢?

在 prototype中給我們提供了兩個方案,一個是Ajax.Updater,另一個是Ajax.PeriodicalUpdater,兩個共同點都是必須傳入3個參數:
container:
response資料要傳達的位置,該位置通過html標籤的id進行定義,比如你要把返回的資料輸出到html中的某個<div>中,則只要把container改成該id的值就可以了。如果找不到該container,則會發生指令碼錯誤。
url:
request請求要傳遞的目的地。該目的地應該是個servlet或jspservlet,因為request對象只能被servlet中的do***方法自動擷取。
options:
結構應該與上面Ajax.Base定義的setOptions()中的option結構相同,如果為空白或不寫,則採用 Ajax.Base定義的初始值(沒有傳遞任何參數時使用)。
兩者的區別在與Ajax.Updater返回給container的是完整的responseText,只有在responseText完全取得又沒發生異常時才會把內容寫到container裡面,而PeriodicalUpdater在擷取responseText時,不管是否已經完整取得,就把內容填進container,直到發生異常或完全取得responseText。大多數情況應該使用第一種方法,因為第一種方法在發生異常時會把異常資訊顯示在container裡面,而第二種就不一定了。
既然已經把xmlhttp封裝好了,我們只需要設定好前面所說的3個參數就可以了,要注意的是,設定options參數,一定要按照base中的options結構進行設定,如果我們使用post方法,還可以在opitons中設定postBody屬性,把要傳遞的queryString 放到body中,一個使用post方法進行傳遞的指令碼例子如下:

/*表單提交用post方法*/
function doRequest(container,paraments,url)
{
var options ={
method: 'post',
asynchronous: true,
postBody: paraments
};
new Ajax.Updater(container,url,options);
}

最後不得不說的是中文編碼問題,prototype對傳遞的參數都進行了編碼轉換工作,每個傳遞值通過encodeURIComponent 進行了處理.編碼會被轉換成utf-8,在後台擷取request時,應該統一使用request.setCharacterEncoding("UTF-8")對request設定編碼,而不必管頁面的編碼格式是什麼.如果使用post方法進行傳遞資料,則會自動執行:
request.setHeader('Content-type','application/x-www-form-urlencoded').確保傳遞資料編碼格式的正確.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.