AJAX 是一種在無需重新加載整個網(wǎng)頁的情況下句占,能夠更新部分網(wǎng)頁的技術(shù)。
什么是 AJAX ?
AJAX = 異步 JavaScript 和 XML畦粮。
AJAX 是一種用于創(chuàng)建快速動態(tài)網(wǎng)頁的技術(shù)露泊。
通過在后臺與服務器進行少量數(shù)據(jù)交換喉镰,AJAX 可以使網(wǎng)頁實現(xiàn)異步更新。這意味著可以在不重新加載整個網(wǎng)頁的情況下惭笑,對網(wǎng)頁的某部分進行更新侣姆。
XMLHttpRequest 是 AJAX 的基礎(chǔ) , XMLHttpRequest 對象用于和服務器交換數(shù)據(jù)。
如需將請求發(fā)送到服務器沉噩,我們使用 XMLHttpRequest 對象的 open() 和 send() 方法:
xmlhttp.open("GET","test1.txt",true);
xmlhttp.send();
GET 還是 POST捺宗?
與 POST 相比,GET 更簡單也更快川蒙,并且在大部分情況下都能用蚜厉。
然而,在以下情況中畜眨,請使用 POST 請求:
- 無法使用緩存文件(更新服務器上的文件或數(shù)據(jù)庫)
- 向服務器發(fā)送大量數(shù)據(jù)(POST 沒有數(shù)據(jù)量限制)
- 發(fā)送包含未知字符的用戶輸入時弯囊,POST 比 GET 更穩(wěn)定也更可靠
如果需要像 HTML 表單那樣 POST 數(shù)據(jù)痰哨,請使用 setRequestHeader() 來添加 HTTP 頭。然后在 send() 方法中規(guī)定您希望發(fā)送的數(shù)據(jù):
url - 服務器上的文件
open() 方法的 url 參數(shù)是服務器上文件的地址:
xmlhttp.open("GET","ajax_test.asp",true);
該文件可以是任何類型的文件匾嘱,比如 .txt 和 .xml斤斧,或者服務器腳本文件,比如 .asp 和 .php (在傳回響應之前霎烙,能夠在服務器上執(zhí)行任務)撬讽。
異步 - True 或 False?
AJAX 指的是異步 JavaScript 和 XML(Asynchronous JavaScript and XML)悬垃。
XMLHttpRequest 對象如果要用于 AJAX 的話游昼,其 open() 方法的 async 參數(shù)必須設(shè)置為 true:
xmlhttp.open("GET","ajax_test.asp",true);
對于 web 開發(fā)人員來說,發(fā)送異步請求是一個巨大的進步尝蠕。很多在服務器執(zhí)行的任務都相當費時烘豌。AJAX 出現(xiàn)之前,這可能會引起應用程序掛起或停止看彼。
通過 AJAX廊佩,JavaScript 無需等待服務器的響應,而是:
- 在等待服務器響應時執(zhí)行其他腳本
- 當響應就緒后對響應進行處理
Async = true
當使用 async=true 時靖榕,請規(guī)定在響應處于 onreadystatechange 事件中的就緒狀態(tài)時執(zhí)行的函數(shù):
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","test1.txt",true);
xmlhttp.send();
服務器響應
如需獲得來自服務器的響應标锄,請使用 XMLHttpRequest 對象的 responseText( 獲得字符串形式的響應數(shù)據(jù) ) 或 responseXML 屬性( 獲得 XML 形式的響應數(shù)據(jù) )。
responseText 屬性
如果來自服務器的響應并非 XML茁计,請使用 responseText 屬性料皇。
responseText 屬性返回字符串形式的響應,因此可以這樣使用:
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
responseXML 屬性
如果來自服務器的響應是 XML星压,而且需要作為 XML 對象進行解析践剂,請使用 responseXML 屬性:
xmlDoc=xmlhttp.responseXML;
txt="";
x=xmlDoc.getElementsByTagName("ARTIST");
for (i=0;i<x.length;i++)
{
txt=txt + x[i].childNodes[0].nodeValue + "<br />";
}
document.getElementById("myDiv").innerHTML=txt;
onreadystatechange 事件
當請求被發(fā)送到服務器時,我們需要執(zhí)行一些基于響應的任務娜膘。
每當 readyState 改變時逊脯,就會觸發(fā) onreadystatechange 事件。
readyState 屬性存有 XMLHttpRequest 的狀態(tài)信息劲绪。
下面是 XMLHttpRequest 對象的三個重要的屬性:
onreadystatechange -- 存儲函數(shù)(或函數(shù)名)男窟,每當 readyState 屬性改變時,就會調(diào)用該函數(shù)贾富。
readyState -- 存有 XMLHttpRequest 的狀態(tài)歉眷。從 0 到 4 發(fā)生變化。
0.請求未初始化
1.服務器連接已建立
2.請求已接收
3.請求處理中
4.請求已完成颤枪,且響應已就緒
status -- 200: "OK" ; 404: 未找到頁面
在 onreadystatechange 事件中汗捡,我們規(guī)定當服務器響應已做好被處理的準備時所執(zhí)行的任務。
當 readyState 等于 4 且狀態(tài)為 200 時,表示響應已就緒:
xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("myDiv").innerHTML=xmlhttp.responseText; } }
注釋:onreadystatechange 事件被觸發(fā) 5 次(0 - 4)扇住,對應著 readyState 的每個變化春缕。
使用 Callback 函數(shù)
callback 函數(shù)是一種以參數(shù)形式傳遞給另一個函數(shù)的函數(shù)。
如果您的網(wǎng)站上存在多個 AJAX 任務艘蹋,那么應該為創(chuàng)建 XMLHttpRequest 對象編寫一個標準的函數(shù)锄贼,并為每個 AJAX 任務調(diào)用該函數(shù)。
該函數(shù)調(diào)用應該包含 URL 以及發(fā)生 onreadystatechange 事件時執(zhí)行的任務(每次調(diào)用可能不盡相同):
function myFunction({
loadXMLDoc("ajax_info.txt",function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200){
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
});
}
AJAX 用于創(chuàng)造動態(tài)性更強的應用程序女阀。