AJAX Hacks 之HACK3. 使用獨立的檔案來取得http request

來源:互聯網
上載者:User
ajax|request AJAX Hacks 之HACK3. 使用獨立的檔案來取得http request

本節講述將初始化request對象的代碼從其他代碼中抽取出來,作為一個單獨的JavaScrip檔案來使用。

當一個Ajax應用程式很大的時候,理清每部分的功能是很有必要的。所以把管理XMLHttpRequest對象的代碼作為一個獨立的js檔案儲存,如果某個頁面使用到它,就將它載入近來,這樣做無疑更容易管理。當代碼需要修改時,只需修改該檔案就是。

hack將所有的和request-object相關的代碼放在了http_request.js檔案中,任何使用XMLHttpReques的頁面都可以通過以下代碼調入該檔案:

下面是該檔案的代碼,帶注釋共有71行:

var request = null;

/* Wrapper function for constructing a Request object.

Parameters:

reqType: HTTP 要求類型GET 或 POST.

url: 伺服器URL

asynch: 是否發送非同步請求。

respHandle: 處理響應的函數.

如果有第五個參數,那就是post的資料*/

function httpRequest(reqType,url,asynch,respHandle){

//Mozilla瀏覽器

if(window.XMLHttpRequest){

request = new XMLHttpRequest();

//如果請求類型是POST,

//第五個參數是post的資料

if(reqType.toLowerCase() != “post” {

initReq(reqType, url,asynch,respHandle);

} else {

//post的資料

var args = arguments[4];

if(args != null && args.length > 0){

initReq(reqType,url,asynch,respHandle,args);

}

}

} else if (window.ActiveXObject){

request=new ActiveXObject(“Msxml2.XMLHTTP”;

if (! request){

request=new ActiveXObject(“Microsoft.XMLHTTP”;

}

if(request){

//如果請求類型是POST,

//第五個參數是post的資料

if(reqType.toLowerCase() != “post” {

initReq(reqType,url,asynch,respHandle);

} else {

var args = arguments[4];

if(args != null && args.length > 0){

initReq(reqType,url,asynch,respHandle,args);

}

}

} else {

alert(“Your browser does not permit the use of all ”+

“of this application‘s features!”;}

} else {

alert(“Your browser does not permit the use of all ”+

“of this application‘s features!”;}

}

/* Initialize a Request object that is already constructed */

function initReq(reqType,url,bool,respHandle){

try{

/* 設定處理響應的函數*/

request.onreadystatechange=respHandle;

request.open(reqType,url,bool);

//如果請求類型是POST,

//第五個參數是post的資料

if(reqType.toLowerCase() == “post” {

request.setRequestHeader(“Content-Type”,

“application/x-www-form-urlencoded; charset=UTF-8”;

request.send(arguments[4]);

} else {

request.send(null);

}

} catch (errv) {

alert(

“The application cannot contact ”+

“the server at the moment. ”+

“Please try again in a few seconds.\n”+

“Error detail: ”+errv.message);

}

}

應用程式通過這段代碼調用httpRequest()函數(4個或5個參數(post))。在其他hack中會出現許多這樣的例子:

var _url = "http://www.parkerriver.com/s/sender";

var _data=“first=Bruce&last=Perry&middle=W”;

httpRequest(“POST”,_url,true,handleResponse,_data);

注釋詳細的描述了各參數的意思,最後一個參數表示伴隨post請求發送的資料。

注意

POST HTTP請求在要求標頭資訊中包含了post的資料。而GET 中是以URL中的name/values的形式出現。

如果代碼沒有使用POST,那麼客戶代碼只使用前4個參數。第四個參數也可以是客戶代碼中聲明了的函數名稱(即:在http_request.js檔案以外出現的其它響應處理函數),或者是一個字面上的函數。接下來的可選的是在一個函數調用中定義一個函數,儘管這樣會使代碼難看並難以閱讀。然而,在HTTP響應處理很短而簡單時使用這樣的方式是很明智的,例如:

var _url = "http://www.parkerriver.com/s/sender";

//a debugging set-up

httpRequest(“POST”,_url,true,function(){alert(request.responseText);});

httpRequest()可以引發相同的瀏覽器檢測並為IE設定XMLHttpReques,initReq()函數處理設定request對象的第二步:指定onreadystatechange 處理函數,調用open()和 send()方法建立一個HTTP請求。代碼使用try/catch 語句來處理相關的異常或錯誤。例如:如果代碼調用open方法發生錯誤時,try/catch語句將捕獲該錯誤,並且快顯視窗。

最後,伴隨著web頁面對http_request.js的引入,request變數可以作為全域變數在任何檔案中使用。

request須作為一個保留變數名,因為會出現在局部變數來幹擾作為全域變數的request,如下述代碼:

function handleResponse(){

//supercedes the imported request variable

var request = null;

try{

if(request.readyState 4){ if(request.status 200){...

讓讀者更清晰的瞭解如何取得request對象,作為獨立檔案使用更靈活。

<

相關文章

聯繫我們

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