AJAX
對於WEB開發人員來說,AJAX這個詞一點也不陌生,現在說說大概會想到以下幾點:
•無重新整理改變頁面資料
•非同步通訊
•$.ajax、$.get、$.post
•Asynchronous Javascript And XML
•...
AJAX就是一種互動網頁應用技術,主要目的的提升使用者體驗,其原理是利用 Javascript的XMLHttpRequest對象與伺服器通訊擷取資料後填充在頁面中,從而實現不重新整理整個頁面卻能把資訊反饋給使用者的效果。
通常使用的AJAX
我們通常使用的AJAX應該絕大多數都是jQuery封裝好的,所以時間久了我們會對jQuery 形成很大的依賴。而且,在有些使用情境裡,我們只用到了AJAX卻把整個jQuery檔案包含進來,這樣會影像網頁的載入時間(在使用者網路不好的情況下更糟糕)。
所以,掌握原生的AJAX寫法還是很有必要的,不僅能擺脫jQuery的依賴,還能進一步加深對非同步通訊的理解。如果抽時間再去研究XMLHttpRequest對象那就更贊了。
原生的AJAX
•產生XMLHttpRequest對象
代碼如下 |
複製代碼 |
var XMLReq; if (window.XMLHttpRequest) { XMLReq = new XMLHttpRequest(); } else { XMLReq = new ActivateXObject('Microsoft.XMLHTTP'); }
|
在IE瀏覽器裡沒有XMLHttpRequest這個對象,要使用 ActivateXObject('Microsoft.XMLHTTP')來替代。
•向伺服器發送請求
代碼如下 |
複製代碼 |
// for GET method XMLReq.open('GET', 'ajax_get.html', true); XMLReq.send(); // for POST method XMLReq.open('POST', 'ajax_post.html', true); XMLReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); XMLReq.send('key=value&key2=value2'); |
上面代碼中XMLReq.open()的第三個參數就是控制是否非同步請求的,當為true的時候就是我們說的非同步通訊,為false的時候就按照正常的javascript邏輯順序執行。真正非同步目的就是在向伺服器請求資料的時候不影響正常的javascript代碼執行,否則一旦請求時間過長或者出錯可能影響整個頁面的瀏覽。
•處理伺服器響應資料
代碼如下 |
複製代碼 |
XMLReq.onreadystatechange = function () { if (4 == XMLReq.readyState && 200 == XMLReq.status) { var data = XMLReq.responseText; // return xml data // var data = XMLReq.responseXML; } } |
一個完整的AJAX請求過程可以對照XMLReq.readyState參數清晰的理解清楚,不同的值表示過程如下:
readyState 過程變化
0 請求未初始化
1 伺服器串連已建立
2 請求已接收
3 請求處理中
4 請求已完成,且響應已就緒
Simple Demo
ajax.html
代碼如下 |
複製代碼 |
<html> <script type="text/javascript" charset="utf8"> function my_ajax(url, callback) { var XMLReq; if (window.XMLHttpRequest) { XMLReq = new XMLHttpRequest(); } else { XMLReq = new ActivateXObject('Microsoft.XMLHTTP'); } XMLReq.onreadystatechange = function() { // alert(XMLReq.readyState); if (4 == XMLReq.readyState && 200 == XMLReq.status) { callback(XMLReq.responseText); } } XMLReq.open('GET', url, false); XMLReq.send(); } function btn_click() { my_ajax('ajax_get.html', function (data) { document.getElementById('result').innerHTML = data; } ); alert('ok'); } </script> <body> <input type="button" value="Click" onclick="btn_click()" /> <div id="result"></div> </body> </html> |
ajax_get.html
代碼如下 |
複製代碼 |
<div> I am ajax get data </div> |
本文意在拋磚引玉,有空的時候能看一看原生的東西,儘管比較複雜。
使用XMLHttpRequest 實現ajax效果
這裡我們用用戶端通過XMLHttpRequest 請求服務端擷取當前系統時間,實現非同步互動!
用戶端myAjax.html代碼:
代碼如下 |
複製代碼 |
<html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>AJAXDEMO</title> </head> <mce:script language="javascript" type="text/javascript"><!-- function btn_onclick() { var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); //建立XMLHTTP對象,相當於 if (!xmlhttp) { alert("建立xmlhttp對象異常!"); return false; } xmlhttp .open("POST","GetDate1.ashx?&ts" +new Date(),false);//準備向伺服器的GetDate1.ashx發出Post請求 xmlhttp.onreadystatechange = function() //需要監聽onreadyStatechange事件 { if(xmlhttp.readyState == 4) //伺服器完成 { if(xmlhttp.status == 200) //如果狀態代碼為200則是成功 { document.getElementById ("Text1").value=xmlhttp.responseText; //responseText屬性為伺服器返回的文本 } else { alert("AJAX伺服器返回錯誤!"); } } } xmlhttp.send(); //才開始發送請求 } // --></mce:script> <body> <input id="Text1" type="text" disabled="disabled" /><input id="button1" type="button" value="顯示系統時間" onclick="btn_onclick()" /> </body> </html> |
服務端GetDate1.ashx 代碼 (用ashx檔案來處理 ,不需要HTML代碼,只需服務端處理返回資料 )
代碼如下 |
複製代碼 |
public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/html"; context.Response.Write(DateTime.Now.ToString()); //顯示服務端時間 }
|