Ajax 是一種在無需從新加載整個網頁的狀況下,可以更新部分網頁的技術。php
Ajax的全稱是Asynchronous JavaScript and XML,即異步JavaScript+XML。它並非新的編程語言,而是幾種原有技術的結合體。它由如下幾種技術組合而成,包括:html
實際上,在Ajax解決方案中這些技術都是可用的,不過只有三種是必須的:HTML/XHTML、DOM以及JavaScript。web
當須要異步與服務器交換數據時,須要XMLHttpRequest對象來異步交換。XMLHttpRequest對象的主要屬性有:ajax
對於readyState的狀態值,其中「0」狀態是在定義後自動具備的狀態值,而對於成功訪問的狀態(獲得信息)咱們大多數採用「4」進行判斷。數據庫
Ajax的核心就是是JavaScript對象XmlHttpRequest,這個對象爲向服務器發送請求和解析服務器響應提供了流暢的接口。XmlHttpRequest可使用JavaScript向服務器提出請求並處理響應,而不阻塞用戶。編程
XHR對象由IE5率先引入,在IE5中XHR對象是經過MSXML庫中一個ActiveX對象實現的,根據IE版本不一樣可能會遇到不一樣版本XHR對象,而IE7+與其它現代瀏覽器均支持原生的XHR對象,在這些瀏覽器中咱們只需使用XMLHttpRequest構造函數就能夠構造XHR對象,所以一個瀏覽器兼容的建立XHR對象的函數寫法大概是這個樣子:瀏覽器
1 var xmlhttp; 2 if (window.XMLHttpRequest) { 3 // code for IE7+, Firefox, Chrome, Opera, Safari 4 xmlhttp=new XMLHttpRequest(); 5 } else { 6 // code for IE6, IE5 7 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 8 }
XMLHttpRequest對象有兩個重要方法 open與send。緩存
1 xmlhttp.open("GET","ajax_info.txt",true); 2 xmlhttp.send();
對於open方法,有幾點須要注意:安全
真正可以向服務器發送請求須要調用send方法,並僅在POST請求能夠傳入參數,不須要則發送null,在調用send方法以後請求被髮往服務器。 服務器
請求發往服務器,服務器根據請求生成響應(Response),傳回給XHR對象,在收到響應後相應數據會填充到XHR對象的屬性,有四個相關屬性會被填充:
在收到響應後第一步是檢查響應狀態,確保響應是否成功返回(狀態爲200)。
1 xhr.open('get','default.aspx,false'); //準備同步請求 2 xhr.send(); 3 if(xhr.status>=200 && xhr.status<300 || xhr.status==304){ 4 //do something 5 }else{ 6 //error handler 7 }
上面代碼在發送同步請求的時候沒問題,只有獲得響應後纔會執行檢查status語句,可是在異步請求時,JavaScript會繼續執行,不等生成響應就檢查狀態碼,這樣咱們不能保證檢查狀態碼語句是在獲得響應後執行(實際上也幾乎不可能,服務器再快一個HTTP請求也不會快過一條JavaScript執行數度),這時候咱們能夠檢查XHR對象的readyState屬性,該屬性表示請求/響應過程當中的當前活動階段,每當readyState值改變的時候都會觸發一次onreadystatechange事件。
咱們能夠利用這個事件檢查每次readyState變化的值,當爲4的時候表示全部數據準備就緒,有一點咱們須要注意:必須在open方法以前指定onreadtstatechange事件處理程序。
1 xmlhttp.onreadystatechange=function(){ 2 if (xmlhttp.readyState==4 && xmlhttp.status==200){ 3 document.getElementById("myDiv").innerHTML=xmlhttp.responseText; 4 } 5 } 6 xmlhttp.open("GET","/try/ajax/ajax_info.txt",true); 7 xmlhttp.send();
與 POST 相比,GET 更簡單也更快,而且在大部分狀況下都能用。
然而,在如下狀況中,請使用 POST 請求:
一個簡單的 GET 請求:
xmlhttp.open("GET","demo_get.html",true); xmlhttp.send();
在上面的例子中,可能獲得的是緩存的結果。
爲了不這種狀況,向 URL 添加一個惟一的 ID:
xmlhttp.open("GET","demo_get.html?t=" + Math.random(),true); xmlhttp.send();
若是但願經過 GET 方法發送信息,向 URL 添加信息:
xmlhttp.open("GET","demo_get2.html?fname=Henry&lname=Ford",true); xmlhttp.send();
一個簡單 POST 請求:
xmlhttp.open("POST","demo_post.html",true); xmlhttp.send();
若是須要像 HTML 表單那樣 POST 數據,請使用 setRequestHeader() 來添加 HTTP 頭。而後在 send() 方法中規定您但願發送的數據:
xmlhttp.open("POST","ajax_test.html",true); xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xmlhttp.send("fname=Henry&lname=Ford");
open() 方法的 url 參數是服務器上文件的地址:
xmlhttp.open("GET","ajax_test.html",true);
該文件能夠是任何類型的文件,好比 .txt 和 .xml,或者服務器腳本文件,好比 .asp 和 .php (在傳回響應以前,可以在服務器上執行任務)。
XMLHttpRequest 對象若是要用於 AJAX 的話,其 open() 方法的 async 參數必須設置爲 true:
xmlhttp.open("GET","ajax_test.html",true);
對於 web 開發人員來講,發送異步請求是一個巨大的進步。不少在服務器執行的任務都至關費時。AJAX 出現以前,這可能會引發應用程序掛起或中止。
經過 AJAX,JavaScript 無需等待服務器的響應,而是:
當使用 async=true 時,規定在響應處於 onreadystatechange 事件中的就緒狀態時執行的函數:
xmlhttp.onreadystatechange=function(){ if (xmlhttp.readyState==4 && xmlhttp.status==200){ document.getElementById("myDiv").innerHTML=xmlhttp.responseText; } } xmlhttp.open("GET","ajax_info.txt",true); xmlhttp.send();