AJAX異步請求原理和過程
AJAX 指異步 JavaScript 及 XML(Asynchronous JavaScript And XML),它不是一種新的編程語言,而是一種使用現有標准的新方法。
AJAX 基於 JavaScript 和 HTTP 請求(HTTP requests)的,因為AJAX 通過在后台與服務器交換少量數據的方式,允許網頁進行異步更新。這意味着有可能在不重載整個頁面的情況下,對網頁的一部分進行更新,通過 AJAX,你可以創建更好、更快以及更友好的 WEB
應用程序
Ajax 可以調用服務器任何資源,可以調用動態頁面、靜態頁面,也可以調用json對象,但是由於瀏覽器無法解析二進制文件,故調用圖片等時就會報錯。
調用json對象時,必須使用eval("(" + 返回的對象 + ")");,否則無法解析對象的資源。
AJAX異步請求原理和過程:
1、AJAX創建異步對象XMLHttpRequest :
AJAX 的要點是 XMLHttpRequest 對象。不同的瀏覽器創建 XMLHttpRequest 對象的方法是有差異的。IE瀏覽器使用 ActiveXObject,而其他的瀏覽器使用名為 XMLHttpRequest 的 JavaScript 內建對象。如需針對不同的瀏覽器來創建此對象,我們要使用一條 "try
and catch" 語句。如下示例:
<script type="text/javascript">
function GetXmlHttpObject()
{
var xmlHttp=null;
try{
// Firefox, Opera 8.0+, Safari等瀏覽器創建XMLHttpRequest對象的方法
xmlHttp=new XMLHttpRequest();
}
catch (e){
// Internet Explorer瀏覽器創建XMLHttpRequest對象的方法
try{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");//IE6.0以上的瀏覽器創建XMLHttpRequest對象的方法
}
catch (e){
try{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");//IE6.0以下的瀏覽器創建XMLHttpRequest對象的方法
}
catch (e){
alert("您的瀏覽器不支持AJAX!");
return false;
}
}
}
return xmlHttp;
}
</script>
首先聲明一個保存 XMLHttpRequest 對象的 xmlHttp 變量。
然后使用 XMLHttp=new XMLHttpRequest() 來創建此對象。這條語句針對 Firefox、Opera 以及 Safari 瀏覽器。假如失敗,則嘗試針對 Internet Explorer 6.0+ 的 xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"),假如也不成功,則嘗試針對 Internet Explorer
5.5+ 的 xmlHttp=new ActiveXObject("Microsoft.XMLHTTP")。
假如這三種方法都不起作用,那么這個用戶所使用的瀏覽器已經太過時了,他或她會看到一個聲明此瀏覽器不支持 AJAX 的提示。
2、操作XMLHttpRequest 對象:
(1)設置請求參數(請求方式,請求頁面的相對路徑,是否異步)
(2)設置回調函數,一個處理服務器響應的函數,使用 onreadystatechange ,類似函數指針,如
xmlHttp.onreadystatechange=function()
{
// 我們需要在這里寫一些代碼
}
(3)獲取異步對象的readyState 屬性:該屬性存有服務器響應的狀態信息。每當 readyState 改變時,onreadystatechange 函數就會被執行。
readyState 屬性可能的值:
0 請求未初始化(在調用 open() 之前)
1 請求已提出(調用 send() 之前)
2 請求已發送(這里通常可以從響應得到內容頭部)
3 請求處理中(響應中通常有部分數據可用,但是服務器還沒有完成響應)
4 請求已完成(可以訪問服務器響應並使用它)
在調用時,我們要向這個 onreadystatechange 函數添加一條 If 語句,來測試我們的響應是否已完成(意味着可獲得數據):
xmlHttp.onreadystatechange=function()
{
if(xmlHttp.readyState==4)
{
// 從服務器的response獲得數據
}
}
(4)判斷響應報文的狀態,若為200說明服務器正常運行並返回響應數據,
(5)讀取響應數據,可以通過 responseText 屬性來取回由服務器返回的數據。
xmlHttp.onreadystatechange=function()
{
if(xmlHttp.readyState==4){
if(xmlHttp.status==200){
document.myForm.time.value=xmlHttp.responseText;
}
}
}
示例如下:
<script type="text/javascript">
function ajaxFunction()
{
var xmlHttp=GetXmlHttpObject();//定義XMLHttpRequest對象
xmlHttp.open("GET","****.ashx",true)//設置請求方法,請求的目標頁面,以及是否異步
xmlHttp.setRequestHeader("If-Modified-Since","0");
xmlHttp.onreadystatechange=function(){ //定義XMLHttpRequest對象的onreadystatechange屬性
if(xmlHttp.readyState==4) { //判斷XMLHttpRequest對象的狀態
if(xmlHttp.status==200){
document.myForm.time.value=xmlHttp.responseText;//通過XMLHttpRequest對象的responseText屬性獲取回傳的數據
}
}
}
xmlHttp.send(null);//發送異步請求
}
</script>
<form name="myForm">
用戶: <input type="text" name="username" onkeyup="ajaxFunction();" />
時間: <input type="text" name="time" />
</form>
</body>
</html>