1. 程式人生 > >初學AJAX總結

初學AJAX總結

AJAX全稱為Asynchronous JavaScript and XML

也就是非同步的JavaScript和XML。

通過在後臺與伺服器進行少量資料交換,AJAX 可以使網頁實現非同步更新。這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。

在學習使用AJAX的過程中,不得不瞭解到一個物件:XMLHttpRequest

所有的現代瀏覽器都支援XMLHttpRequest物件(IE5和IE6要用ActiveXObject)。

XMLHttpRequest用於在後臺與伺服器交換資料。

建立XMLHttpRequest物件的語法:

variable = new XMLHttpRequest();
老版本的IE5和IE6建立ActiveXObject物件:

variable = new AvtiveXObject("Microsoft.XMLHTTP");
我們可以通過JavaScript中的 window.XMLHttpRequest屬性來判斷瀏覽器支援哪種物件。

如果支援就使用XMLHttpRequest物件,不支援就使用AvtiveXObject物件。

判斷程式碼如下:

var xmlhttp;
if (window.XMLHttpRequest)
{
    //  IE7+, Firefox, Chrome, Opera, Safari 瀏覽器執行程式碼
    xmlhttp=new XMLHttpRequest();
}
else
{
    // IE6, IE5 瀏覽器執行程式碼
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
建立了與伺服器進行資料交換的物件之後,我們來了解一下向伺服器傳送請求的兩個方法。

open(method,url,async):此方法規定請求的型別,URL以及是否非同步處理請求。

method:請求的型別,GET或者POST;

url:檔案在伺服器上的位置;

async:true(非同步),false(同步)。

send(string):將請求傳送到伺服器。

string:僅用於POST請求,GET請求傳送字串在情況在url後面加上要傳的引數。


那麼我們什麼時候用GET請求,什麼時候用POST請求呢。

與POST相比,GET更簡單也更快,並且在大部分情況下都能用。

但是在如下幾種情況中,請使用POST請求:

1.無法使用快取檔案(更新伺服器上的檔案或資料庫)。

2.向伺服器傳送大量資料(POST沒有資料量限制)。

3.傳送包含未知字元的使用者輸入時,POST比GET更穩定也更可靠。


第一個方法第三個引數為true,使用非同步請求的好處是:

在等待伺服器響應時執行其他指令碼,當響應就緒後對響應進行處理。


當我們獲得伺服器的響應時,伺服器會給我們傳回響應的資料,資料有兩種形式,分別是Text形式和XML形式。

responseText:獲得字串形式的響應資料。

responseXML:獲得XML形式的響應資料。

responseText和responseXML都是XMLHttpRequest的屬性。


接下來讓我們以一個例子來講解如何使用AJAX,其中會用到一個onreadystatechange函式,我們在例子後面對它進行解析。

程式碼如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script>
function loadXMLDoc()
{
	var xmlhttp;
	if (window.XMLHttpRequest)
	{
		//  IE7+, Firefox, Chrome, Opera, Safari 瀏覽器執行程式碼
		xmlhttp=new XMLHttpRequest();
	}
	else
	{
		// IE6, IE5 瀏覽器執行程式碼
		xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
	}
	//當readyState狀態發生改變時,執行的回撥函式
	xmlhttp.onreadystatechange=function()
	{
		//當請求已完成且已經響應成功時執行
		if (xmlhttp.readyState==4 && xmlhttp.status==200)
		{
			document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
		}
	}
	//設定請求型別併發送
	xmlhttp.open("GET","www.baidu.com",true);
	xmlhttp.send();
}
</script>
</head>
<body>

<div id="myDiv"><h2>使用 AJAX 修改該文字內容</h2></div>
<button type="button" onclick="loadXMLDoc()">修改內容</button>

</body>
</html>

在如上程式碼的 loadXMLDoc()函式中進行了三個操作:

1.建立XMLHttpRequest物件。

2.當伺服器響應就緒時執行函式。

3.把請求傳送到我們伺服器上面的檔案。


在瞭解XMLHttpRequest的onreadystatechange函式之前,我們先來了解一下伺服器響應時的一些狀態變化。

readyState:存有XMLHttpRequest的狀態,從0到4發生變化。

0:請求未初始化。

1:伺服器連線已建立。

2:請求已接收。

3:請求處理中。

4:請求已完成,且響應已就緒。


status:響應的狀態。

200:響應成功。

403:請求不允許。

404:沒有發現請求的URL。

500:伺服器產生內部錯誤。


在瞭解了伺服器狀態的改變之後,我們再來看看onreadystatechange函式。

onreadystatechange函式是一個回撥函式,每當readyState狀態發生一次改變,就會觸發一次onreadystatechange函式事件。

也就是說一次完整的請求readyState狀態從0變到4,onreadystatechange函式事件會被呼叫5次。

在我們的程式碼中,當 readyState==4 && status==200 也就是請求已完成且已經響應成功的時候,把請求返回的資料給輸出到 id="myDiv"的標籤中。


其實你可能會發現,在使用AJAX請求伺服器的時候,很多地方是通用的,不同的地方只是我們請求的URL地址和回撥函式執行的操作。

那麼我們可以把相同的部分進行封裝,這樣當我們存在多個AJAX請求的時候,就可以重複呼叫了。

示例程式碼:

<!DOCTYPE html>
<html>
<head>
<script>
var xmlhttp;
function loadXMLDoc(url,cfunc)
{
if (window.XMLHttpRequest)
  {// IE7+, Firefox, Chrome, Opera, Safari 程式碼
  xmlhttp=new XMLHttpRequest();
  }
else
  {// IE6, IE5 程式碼
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=cfunc;
xmlhttp.open("GET",url,true);
xmlhttp.send();
}
function myFunction()
{
	loadXMLDoc("/try/ajax/ajax_info.txt",function()
	{
		if (xmlhttp.readyState==4 && xmlhttp.status==200)
		{
			document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
		}
	});
}
</script>
</head>
<body>

<div id="myDiv"><h2>使用 AJAX 修改文字內容</h2></div>
<button type="button" onclick="myFunction()">修改內容</button>

</body>
</html>