原生 JS 與 jQuery 中的 AJAX
AJAX = Asynchronous JavaScript and XML(非同步的 JavaScript 和 XML)。
AJAX 最大的優點是在不重新載入整個頁面的情況下,可以與伺服器交換數據並更新部分網頁內容。運用 XMLHttpRequest 或新的 Fetch API 與網頁伺服器進行非同步資料交換;AJAX 是一種用於創建快速動態網頁的技術。
AJAX是基於現有的Internet標準,並且聯合使用它們:
XMLHttpRequest 對象 (非同步的與伺服器交換數據);
JavaScript/DOM (資訊顯示/交互);
CSS (給數據定義樣式);
XML (作為轉換數據的格式)。
AJAX應用程式與瀏覽器和平台無關的。
一、AJAX 工作原理

XMLHttpRequest 是 AJAX 的基礎。XMLHttpRequest 用於在後台與伺服器交換數據。這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。
二、原生 JS 中的 AJAX
1、創建 XMLHttpRequest 對象
為了應對所有的現代瀏覽器,包括 IE5 和 IE6,請檢查瀏覽器是否支援 XMLHttpRequest 對象。如果支援,則創建 XMLHttpRequest 對象。如果不支援,則創建 ActiveXObject :
var xmlhttp;
if (window.XMLHttpRequest) {
// IE7+, Firefox, Chrome, Opera, Safari 瀏覽器執行程式碼
xmlhttp=new XMLHttpRequest();
}
else {
// IE6, IE5 瀏覽器執行程式碼
xmlhttp=new ActiveXObject(“Microsoft.XMLHTTP”);
}
2、AJAX – 向伺服器發送請求
如需將請求發送到伺服器,我們使用XMLHttpRequest對象的open()和send()方法:
open(method,url,async)
規定請求的類型、URL 以及是否非同步處理請求。
- method:請求的類型;GET 或 POST
- url:文件在伺服器上的位置
- async:true(非同步)或 false(同步)
send(string)
將請求發送到伺服器。
string:僅用於 POST 請求
3、GET 還是 POST?
與 POST 相比,GET 更簡單也更快,並且在大部分情況下都能用。然而,在以下情況中,請使用 POST 請求:
- 無法使用快取文件(更新伺服器上的文件或資料庫)
- 向伺服器發送大量數據(POST 沒有數據量限制)
- 發送包含未知字元的用戶輸入時,POST 比 GET 更穩定也更可靠
(1)GET 請求
xmlhttp.open(“GET”,”/try/ajax/demo_get2.php?fname=Henry&lname=Ford”,true);
xmlhttp.send();//如果希望通過 GET 方法發送資訊,請向 URL 添加資訊。
(2) POST 請求
xmlhttp.open(“POST”,”/try/ajax/demo_post.php”,true);
xmlhttp.send();
如果需要像 HTML 表單那樣 POST 數據,要使用 setRequestHeader() 來添加 HTTP 頭,然後在 send() 方法中規定您希望發送的數據:
xmlhttp.open(“POST”,”/try/ajax/demo_post2.php”,true);
xmlhttp.setRequestHeader(“Content-type”,”application/x-www-form-urlencoded”);
xmlhttp.send(“fname=Henry&lname=Ford”);
setRequestHeader(header,value):向請求添加 HTTP 頭。
- header: 規定頭的名稱
- value: 規定頭的值
open() 方法的url參數是伺服器上文件的地址。該文件可以是任何類型的文件,比如 .txt 和 .xml,或者伺服器腳本文件,比如 .asp 和 .php (在傳迴響應之前,能夠在伺服器上執行任務)。
4、非同步 – True 或 False?
XMLHttpRequest 對象如果要用於 AJAX 的話,其 open() 方法的 async 參數必須設置為 true。
(1) Async=true
當使用 async=true 時,請規定在響應處於 onreadystatechange 事件中的就緒狀態時執行的函數:
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
document.getElementById(“myDiv”).innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open(“GET”,”/try/ajax/ajax_info.txt”,true);
xmlhttp.send();
(2) Async = false
如需使用 async=false,請將 open() 方法中的第三個參數改為 false,不推薦使用 async=false,但是對於一些小型的請求,也是可以的。JavaScript 會等到伺服器響應就緒才繼續執行。如果伺服器繁忙或緩慢,應用程式會掛起或停止。
注意:當使用 async=false 時,不要編寫 onreadystatechange 函數,把程式碼放到 send() 語句後面即可
xmlhttp.open(“GET”,”/try/ajax/ajax_info.txt”,false);
xmlhttp.send();
document.getElementById(“myDiv”).innerHTML=xmlhttp.responseText;
5、AJAX – 伺服器響應
如需獲得來自伺服器的響應,請使用 XMLHttpRequest 對象的 responseText 或 responseXML 屬性。
|
responseText |
獲得字元串形式的響應數據。 |
|
responseXML |
獲得 XML 形式的響應數據。 |
如果來自伺服器的響應是 XML,而且需要作為 XML 對象進行解析,請使用 responseXML 屬性。
6、onreadystatechange 事件
每當 readyState 改變時,就會觸發 onreadystatechange 事件。
readyState 屬性存有 XMLHttpRequest 的狀態資訊。

在 onreadystatechange 事件中,我們規定當伺服器響應已做好被處理的準備時所執行的任務。
當 readyState 等於 4 且狀態為 200 時,表示響應已就緒:
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
document.getElementById(“myDiv”).innerHTML=xmlhttp.responseText;
}
}
注意:onreadystatechange 事件被觸發 4 次(0 – 4), 分別是: 0-1、1-2、2-3、3-4,對應著 readyState 的每個變化
<!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");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","/try/ajax/ajax_info.txt",true);
xmlhttp.send();
}
</script>
</head>
<body>
<div id="myDiv"><h2>使用 AJAX 修改該文本內容</h2></div>
<button type="button" onclick="loadXMLDoc()">修改內容</button>
</body>
</html>
三、jQuery 中的 AJAX
通過 jQuery AJAX 方法,能夠使用 HTTP Get 和 HTTP Post 從遠程伺服器上請求文本、HTML、XML 或 JSON – 同時能夠把這些外部數據直接載入網頁的被選元素中。
1、jQuery load() 方法
load() 方法從伺服器載入數據,並把返回的數據放入被選元素中。
語法:
$(selector).load(URL,data,callback);
必需的URL參數規定希望載入的 URL。
可選的data參數規定與請求一同發送的查詢字元串鍵/值對集合。
可選的callback參數是 load() 方法完成後所執行的函數名稱。
也可以把 jQuery 選擇器添加到 URL 參數。
eg $(“#div1”).load(“demo_test.txt #p1”);
可選的 callback 參數規定當 load() 方法完成後所要允許的回調函數。回調函數可以設置不同的參數:
- responseTxt- 包含調用成功時的結果內容
- statusTXT- 包含調用的狀態
- xhr- 包含 XMLHttpRequest 對象
$(“button”).click(function(){
$(“#div1”).load(“demo_test.txt”,function(responseTxt,statusTxt,xhr){
if(statusTxt==”success”)
alert(“外部內容載入成功!”);
if(statusTxt==”error”)
alert(“Error: “+xhr.status+”: “+xhr.statusText);
});
});
2、jQuery $.get() 方法
$.get() 方法通過 HTTP GET 請求從伺服器上請求數據。
語法:
$.get(URL,callback);
必需的URL參數規定希望請求的 URL。
可選的callback參數是請求成功後所執行的函數名。
$(“button”).click(function(){
$.get(“demo_test.php”,function(data,status){
alert(“數據: ” + data + “\n狀態: ” + status);
});
});
第二個參數是回調函數。第一個回調參數存有被請求頁面的內容,第二個回調參數存有請求的狀態。
3、jQuery $.post() 方法
$.post() 方法通過 HTTP POST 請求向伺服器提交數據。
語法:
$.post(URL,data,callback);
必需的URL參數規定您希望請求的 URL。
可選的data參數規定連同請求發送的數據。
可選的callback參數是請求成功後所執行的函數名。
$(“button”).click(function(){
$.post(“/try/ajax/demo_test_post.php”,
{
name:”菜鳥教程”,
url:”//www.runoob.com”
},
function(data,status){
alert(“數據: \n” + data + “\n狀態: ” + status);
});
});
4、GET 和 POST 方法的區別:
1、發送的數據數量
在 GET 中,只能發送有限數量的數據,因為數據是在 URL 中發送的。
在 POST 中,可以發送大量的數據,因為數據是在正文主體中發送的。
2、安全性
GET 方法發送的數據不受保護,因為數據在 URL 欄中公開,這增加了漏洞和黑客攻擊的風險。
POST 方法發送的數據是安全的,因為數據未在 URL 欄中公開,還可以在其中使用多種編碼技術,這使其具有彈性。
3、加入書籤中
GET 查詢的結果可以加入書籤中,因為它以 URL 的形式存在;而 POST 查詢的結果無法加入書籤中。
4、編碼
在表單中使用 GET 方法時,數據類型中只接受 ASCII 字元。
在表單提交時,POST 方法不綁定表單數據類型,並允許二進位和 ASCII 字元。
5、可變大小
GET 方法中的可變大小約為 2000 個字元。
POST 方法最多允許 8 Mb 的可變大小。
6、快取
GET 方法的數據是可快取的,而 POST 方法的數據是無法快取的。
7、主要作用
GET 方法主要用於獲取資訊。而 POST 方法主要用於更新數據。



