【AJAX】AJAX 的簡單應用
AJAX (Asynchronous JavaScript and XML) 是一種使用現有標準的新方法。
AJAX 是一種在無需重新載入整個網頁的情況下,能夠更新部分網頁的技術。
傳統的網頁如果需要更新內容,則需要過載整個頁面。
AJAX 是一種用於建立快速動態網頁的技術。通過在後臺與伺服器進行少量資料交換,AJAX 可以使網頁實現非同步更新。這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。
XMLHttpRequest
XMLHttpRequest 是 AJAX 的基礎。
所有現代瀏覽器均支援 XMLHttpRequest 物件(IE5 和 IE6 使用 ActiveXObject)。
XMLHttpRequest 用於在後臺與伺服器交換資料。
為了應對所有的現代瀏覽器,包括 IE5 和 IE6,請檢查瀏覽器是否支援 XMLHttpRequest 物件。如果支援,則建立 XMLHttpRequest 物件。如果不支援,則建立 ActiveXObject :
var xhttp; if (window.XMLHttpRequest) { // IE7+, Firefox, Chrome, Opera, Safari 瀏覽器執行程式碼 xhttp=new XMLHttpRequest(); } else { // IE6, IE5 瀏覽器執行程式碼 xhttp=new ActiveXObject("Microsoft.XMLHTTP"); }
XMLHttpRequest 物件屬性
屬性 | 描述 |
---|---|
onreadystatechange | 定義當 readyState 屬性發生變化時被呼叫的函式 |
readyState | 儲存 XMLHttpRequest 的狀態。0:請求未初始化;1:伺服器連線已建立;2:請求已收到;3:正在處理請求;4:請求已完成且響應已就緒。 |
responseText | 獲得字串形式的響應資料。 |
responseXML | 獲得 XML 形式的響應資料。 |
status | 返回請求的狀態號。200: "OK";403: "Forbidden";404: "Not Found"等 |
statusText | 返回狀態文字(比如 "OK" 或 "Not Found") |
XMLHttpRequest 物件方法
方法 | 描述 |
---|---|
abort() | 取消當前請求 |
getAllResponseHeaders() | 返回頭部資訊 |
getResponseHeader(headerTag) | 返回特定的頭部資訊 |
open(method, url, async, user, psw) | 規定請求的型別(GET or POST)、URL、是否非同步處理、使用者名稱(可選)、密碼(可選) |
send() | 將請求傳送到伺服器,用於 GET 請求 |
send(string) | 將請求傳送到伺服器,用於 POST 請求 |
setRequestHeader(header, value) | 向要傳送的報頭新增標籤/值對 |
向伺服器傳送請求
如需向伺服器傳送請求,我們使用 XMLHttpRequest 物件的 open() 和 send() 方法。下面來了解下這兩個方法的使用。
open(method, url, async)
:
- method:GET or POST。
- url:伺服器檔案位置。該檔案可以是任何型別的檔案,如 .txt 和 .xml,或伺服器指令碼檔案,如 .asp 和 .php。
- asnyc:true(非同步)或 false(同步)。
通過非同步傳送,JavaScript 不必等待伺服器響應,而是可以:
- 在等待伺服器響應時執行其他指令碼
- 當響應就緒時處理響應
所以不推薦同步的 XMLHttpRequest (async = false),因為 JavaScript 將停止執行直到伺服器響應就緒。如果伺服器繁忙或緩慢,應用程式將掛起或停止。
GET 比 POST 更簡單更快,可用於大多數情況下。
不過,在以下情況要始終使用 POST:
- 快取檔案不是選項(更新伺服器上的檔案或資料庫)
- 向伺服器傳送大量資料(POST 無大小限制)
- 傳送使用者輸入(可包含未知字元),POST 比 GET 更強大更安全
GET 請求:
xhttp.open("GET", "ajax_info.txt", true);
xhttp.send();
如果需要用 GET 方法來發送資訊,可以 直接在URL 中新增這些資訊:
xhttp.open("GET", "ajax_info.txt?info1=value1&info2=value2", true);
xhttp.send();
POST 請求:
xhttp.open("POST", "ajax_info.txt", true);
xhttp.send();
如需像 HTML 表單那樣 POST 資料,先通過 setRequestHeader() 新增一個 HTTP 頭部,然後在 send() 方法中規定您需要傳送的資料:
xhttp.open("POST", "ajax_test.asp", true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send("info1=value1&info2=value2");
處理伺服器響應
每當 readyState 發生變化時就會呼叫 onreadystatechange 函式。
注意: onreadystatechange 事件被觸發 4 次(0 - 4), 分別是: 0-1、1-2、2-3、3-4,對應著 readyState 的每個變化。
通過 XMLHttpRequest 物件,您可以定義當請求接收到應答時所執行的函式。這個函式是在 XMLHttpResponse 物件的 onreadystatechange 屬性中定義的:
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) { //當 readyState 為 4,status 為 200 時,響應就緒
document.getElementById("demo").innerHTML = this.responseText;
}
};
xhttp.open("GET", "ajax_info.txt", true);
xhttp.send();
如果來自伺服器的響應是 XML,而且需要作為 XML 物件進行解析,使用 responseXML 屬性。
XMLHttpRequest 物件有一個內建的 XML 解析器。ResponseXML 屬性以 XML DOM 物件返回伺服器響應。使用此屬性,您可以把響應解析為 XML DOM 物件。
如果來自伺服器的響應並非 XML,請使用 responseText 屬性。
如果您的網站中有多個 AJAX 任務,那麼您應該建立一個執行 XMLHttpRequest 物件的函式,以及一個供每個 AJAX 任務的回撥函式。
loadDoc("url-1", myFunction1);
loadDoc("url-2", myFunction2);
function loadDoc(url, cFunction) {
var xhttp;
xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
cFunction(this);
}
};
xhttp.open("GET", url, true);
xhttp.send();
}
function myFunction1(xhttp) {
//處理響應程式碼
}
function myFunction2(xhttp) {
// 處理響應程式碼
}
讀取 JSON 檔案
假設 JSON 檔案內容是一個數組
function loadXMLDoc() {
var xhttp;
if (window.XMLHttpRequest) {
// IE7+, Firefox, Chrome, Opera, Safari 瀏覽器執行程式碼
xhttp = new XMLHttpRequest();
} else {
// IE6, IE5 瀏覽器執行程式碼
xhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function() {
if (xhttp.readyState == 4 && xhttp.status == 200) {
myFunction(this)
}
}
xmlhttp.open("GET","json_url",true);
xmlhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xmlhttp.send();
}
function myFunction(xhttp) {
var arr = JSON.parse(xhttp.responseText);
//處理 arr
}