[Ajax-相濡以沫,不如相忘於江湖] Ajax核心: XMLHttpRequest對象

Ajax應用工做模式/過程:
javascript

    第一步,初始化XMLHttpRequest對象;
html

    第二步,打開與服務器的鏈接。打開鏈接時,指定發送請求的方法: 採用GET或POST; 指定是否採用異步方式;
java

    第三部,設置監聽XMLHttpRequest狀態改變的事件處理函數;
瀏覽器

    第四部,發送請求。如採用POST方式發送請求,可發送帶參數的請求。
緩存

下面給出一個示例: 級聯菜單。頁面中兩個下拉框,選擇或改變下拉框1的值將影響下拉框2中所加載的值。服務器

<!DOCTYPE html>
<html>
<head>
	<title>XMLHttpRequest -- Test</title>
</head>
<body>
	<select name="first" id="first" onchange="change(this.value);">
		<option value="1">中國</option>
		<option value="2">美國</option>
		<option value="3">日本</option>
	</select>
	<select name="second" id="second"></select>
	<div id="output"></div>

	<script type="text/javascript">
		// 定義XMLHttpRequest對象
		var xmlrequest;
		// 初始化XMLHttpRequest對象
		function createXMLHttpRequest() {
			if (window.XMLHttpRequest) {
				xmlrequest = new XMLHttpRequest();
			} else if (window.ActiveXObject) {
				try {
					xmlrequest = new ActiveXObject("Msxml2.XMLHTTP");
				} catch (e) {
					try {
						xmlrequest = new ActiveXObject("Microsoft.XMLHTTP");
					} catch (e) {
					}
				}
			}
		}

		function change(id) {
			// 初始化XMLHttpRequest對象
			createXMLHttpRequest();
			// 設置請求相應的URL
			var uri = "second.jsp?id=" + id;
			// 打開與服務器響應地址的鏈接
			xmlrequest.open("POST", uri, true);
			// 設置請求頭
			xmlrequest.setRequestHeader("Content-Type", "application/x-www.form-urlencoded");
			// 設置處理相應的回調函數
			xmlrequest.onreadystatechange = processResponse;
			// 發送請求
			xmlrequest.send(null);
		}

		// 定義處理響應的回調函數
		function processResponse() {
			// 響應完成且響應正常
			if (xmlrequest.readyState == 4) {
				if (xmlrequest.status == 200) {
					var cities = xmlrequest.responseText.split('$');
					var displaySelect = document.getElementById("second");
					displaySelect.innerHTML = null;
					
					for (var i=0; i<cities.length; i++) {
						var opt = document.createElement("option");
						opt.innerHTML = cities[i];
						displaySelect.appendChild(opt);
					}
					// 信息已經成功返回,開始處理信息
					//var headers = xmlrequest.getAllResponseHeaders();
					// 經過警告框輸出響應頭
					//alert("響應頭類型: " + typeof headers + "\n" + headers);
					// 在頁面輸出全部響應頭
					//document.getElementById("output").innerHTML = headers;
				}
			} else {
				// 頁面不正常
				//window.alert("狀態信息: " + xmlrequest.readyState + " -- 服務器響應狀態信息: " + xmlrequest.status + "-- 服務器狀態信息描述: " + xmlrequest.statusText + "-- 請求頁面有異常!");
			}
		}
	</script>
</body>
</html>

XMLHttpRequest對象定義:
app

XMLHttpRequest是一套能夠在JavaScript、VBScript、JScript等腳本語言中使用的API,它經過HTTP協議異步地向服務器發送請求,獲取服務器返回的響應。XMLHttpRequest的用處是: 提供與服務器異步通訊的能力。
異步

XMLHttpRequest的方法和屬性:jsp

XMLHttpRequest包含了一些基本的屬性和方法,XMLHttpRequest正是經過這些屬性和方法與服務器通訊的。
async

XMLHttpRequest的方法:

   XMLHttpRequest對象的方法並很少,如下是其基本方法:

  • abort(): 中止發送當前對象。

  • getAllResponseHeaders(): 獲取服務器返回的所有響應頭。

  • getResponseHeader("headerLabel"): 根據響應頭的名字,獲取對應的響應頭。

  • open("method", "URL"[,asyncFlag[,"userName"[,"password"]]]): 創建與服務器URL的鏈接,並設置請求的方法,以及是否使用異步請求。若是遠程服務須要使用用戶名、密碼,則提供對應的信息。

  • send(content): 發送請求。其中content是請求參數。

  • setRequestHeader("label", "value"): 在發送請求以前,先設置請求頭。

XMLHttpRequest的屬性:

  • onreadystatechange: 該屬性用於指定XMLHttpRequest對象狀態改變時的事件處理函數。

  • readyState: 該屬性用於獲取XMLHttpRequest對象的處理狀態。

  • responseText: 該屬性用於獲取服務器的響應文本。

  • responseXML: 該屬性用於獲取服務器相應的XML文檔對象。

  • status: 該屬性是服務器返回的狀態嗎,只有服務器的響應已經完成時,纔會有該狀態碼。

  • statusText: 該屬性是服務器返回的狀態文本信息,只有當服務器的響應已經完成時,纔會有該狀態文本信息。 

屬性詳解:

onreadystatechange:

    onreadystatechange屬性用於指定XMLHttpRequest對象的狀態改變函數。當XMLHttpRequest對象的狀態改變時,該函數將被觸發。onreadystatechange屬性的做用與按鈕對象的onclick屬性同樣,都是事件處理屬性。也就是說,XMLHttpRuquest對象是事件源,它能夠引起readystatechange事件。當程序講一個函數引用賦給XMLHttpRequest對象的onreadystatechange屬性後,該函數即成爲XMLHttpRequest對象的事件處理器。每次XMLHttpRequest發生readystatechange事件,都會觸發監聽該事件的事件處理器。

readyState:

    XMLHttpRequest對象有以下幾種狀態,這些狀態可經過readyState屬性得到:

  • 0:XMLHttpRequest對象尚未完成初始化

  • 1:XMLHttpRequest對象開始發送請求

  • 2:XMLHttpRequest對象的請求發送完成

  • 3:XMLHttpRequest對象開始讀取服務器的響應

  • 4:XMLHttpRequest對象讀取服務器響應結束

    XMLHttpRequest對象的這幾種狀態信息可經過readyState屬性讀取。每當XMLHttpRequest對象的readyState屬性改變時,其onreadystatechange屬性指定的方法都會被觸發。

status和statusText:

    服務器的響應完成後(readyState=4),依然不能直接獲取服務器響應。由於服務器響應也有不少種狀況。爲了判斷服務器的響應是否正確,能夠檢測XMLHttpRequest的status或statusText屬性。當服務器的響應正常時,JavaScript才應該讀取服務器響應信息,並將響應信息動態加載到目標頁面。

    服務器經常使用的狀態碼及其對應的含義以下:

  • 200:服務器響應正常

  • 304:該資源在上次請求以後沒有任何修改。這一般用於瀏覽器的緩存機制,使用GET請求時尤爲須要注意

  • 400:沒法找到請求的資源

  • 401:訪問資源的權限不夠

  • 403:沒有權限訪問資源

  • 404:須要訪問的資源不存在

  • 405:須要訪問的資源被禁止

  • 407:訪問的資源須要代理身份驗證

  • 414:請求的URL太長

  • 500:服務器內部錯誤

    若是想經過JavaScript獲取服務器響應,必須先判斷服務器響應是否完成。要判斷服務器的響應是否完成,只需判斷XMLHttpRequest對象的readyState屬性便可,當readyState值爲4,表明響應完成;服務器響應完成後,還應判斷服務器響應是否正確,要判斷服務器響應是否正確,可經過判斷XMLHttpRequest對象的status屬性進行。當status值爲200時,服務器響應正確,不然響應不正常。

發送請求:

發送GET請求:

    一般狀況下,GET請求用於從服務器上獲取數據,POST請求用於向服務器發送數據。GET請求將全部請求參數轉換成一個查詢字符串,並將該字符串添加到請求的URL以後,於是可在請求的URL後看到請求參數名、請求參數值。若是將某個表單的action屬性設置爲GET,則請求會將表單中個字段的名和值轉換爲字符串,並附加到URL以後。

    GET 和 POST異同:

  • GET請求傳送的數據量較小,通常不能大於2KB。POST傳送的數據量較大,一般認爲POST請求參數的大小不受限制,但每每取決於服務器的限制。一般來講,POST請求的數據量總比GET請求的數據量大。

  • POST請求則經過HTTP POST機制,將請求的參數以及對應的值放在HTML Header中傳輸,用戶看不到明碼的請求參數值。

當使用Ajax發送異步請求時,建議使用POST請求,而不是GET請求。發送GET請求需注意以下兩點:

  • 經過open方法開與服務器的鏈接時,設置使用GET方法。

  • 如須要發送請求參數,應將請求參數轉成查詢字符串,並追加到請求URL以後。

注意:

雖然GET請求的請求參數附加在URL以後的,但使用send方法時,仍是應該爲send方法傳入參數。若是調用send方法時無須發送請求參數,則使用null做爲參數便可。

發送POST請求:

POST請求的適應性更廣,可以使用更大的請求參數,且POST請求的請求參數一般不能直接看到。

發送POST請求一般須要一下三個步驟:

第一步,使用open方法打開鏈接時,指定使用POST方式發送請求;

第二步,設置正確的請求頭,POST請求一般應設置Content-Type請求頭;

第三步,發送請求,把請求參數轉換爲查詢字符串,將該字符串做爲send()方法的參數。

注意: 使用POST方法發送請求,同樣能夠將請求參數附加到URL以後。

相關文章
相關標籤/搜索