Ajax全稱是Asynchronous JavaScript XML,這并不是一項(xiàng)新技術(shù),而只是將一些已有的技術(shù)進(jìn)行了整合,從而實(shí)現(xiàn)了頁面在不刷新的狀態(tài)下也可以連接服務(wù)器來更新頁面內(nèi)容,也即部分刷新技術(shù),或不完全刷新。
Ajax的核心類是XMLHttpRequest類,從IE5.0開始被支持,Ajax的處理過程大概是這個(gè)樣子的:
1.首先通過JavaScript來建立一個(gè)XMLHttpRequest類的實(shí)例;
2.通過屬性onreadystatechange來設(shè)定回調(diào)函數(shù);
3.調(diào)用該實(shí)例的open方法:open(數(shù)據(jù)傳送方式GET/POST,服務(wù)器URL,是否異步,[用戶名],[口令]);
4.調(diào)用該實(shí)例的send方法:send(XML數(shù)據(jù)/字符串/流/無符號(hào)整數(shù)數(shù)組/null),注意如果為null,則表示不傳遞額外的數(shù)據(jù),僅用Open方法中指定的服務(wù)器URL來進(jìn)行響應(yīng)即可;
5.在回調(diào)函數(shù)中先通過readyState屬性檢測異步操作的狀態(tài):未初始化(0),正在加載(1),已加載(2),交互(3),已完成(4);
6.再在回調(diào)函數(shù)中檢測服務(wù)器返回的HTTP狀態(tài)碼status,200代表正常;
7.再在回調(diào)函數(shù)中,利用返回的數(shù)據(jù)(responseBody:返回為無符號(hào)整數(shù)數(shù)組/responseStream:返回為IStream流/responseText :返回字符串/responseXML:返回為XML格式數(shù)據(jù)。),基于DOM,使用JavaScript技術(shù)來修改文檔的結(jié)構(gòu)。
總結(jié)一下:
其實(shí),Ajax就是通過JavaScript創(chuàng)建XMLHttpRequest對(duì)象,再由JavaScript調(diào)用XMLHttpRequest對(duì)象的方法完成異步通信;然后,再由JavaScript通過DOM的屬性和方法,完成頁面的不完全刷新。
最后再說明一下異步:同步表示send之后需要一直等待服務(wù)器完全響應(yīng)之后才能進(jìn)行后續(xù)的操作,因此需要等待;而異步表示send之后立即返回,可以繼續(xù)其他的操作,而服務(wù)器一旦返回后可以自行調(diào)用回調(diào)函數(shù)來執(zhí)行動(dòng)作。
在ASP.NET應(yīng)用中,可以先安裝一個(gè)Microsoft ASP.NET 2.0 AJAX Extensions 1.0,然后就可以使用Ajax的一些常用控件了,比如UpdatePanel,以及Timer等,但用之前不要忘記在頁面開始加一個(gè)ScriptManager;也可以再安裝AjaxControlToolkit來獲得更多的Ajax控件。
=========================
Ajax 應(yīng)用程序所用到的基本技術(shù)
1.html
組成web頁面所用到的基本元素
2.javascript
javascript代碼是AJAX應(yīng)用程序核心的代碼,幫助ajax程序改進(jìn)與服務(wù)器通訊以實(shí)現(xiàn)不一樣的用戶體驗(yàn)
3.Dynamic HTML
用于動(dòng)態(tài)更新web頁面
4.DOM(文檔對(duì)象模型)
用于通過javascrip代碼處理HTML或服務(wù)器返回的XML
javascript與服務(wù)器端通信的最核心的對(duì)象
xmlHttp對(duì)象:傳送XML格式數(shù)據(jù)的超文本傳輸協(xié)議
實(shí)際上XMLHTTP傳輸?shù)臄?shù)據(jù)可以是XML格式數(shù)據(jù),也可以是字符串,流,或者一個(gè)無符號(hào)整數(shù)數(shù)組。還可以是URL的參數(shù),它下達(dá)的結(jié)果可以是XML格式數(shù)據(jù),也可以是字符串,流,或者一個(gè)無符號(hào)整數(shù)數(shù)組。
調(diào)用步驟
1、創(chuàng)建XMLHTTP對(duì)象
2、打開與服務(wù)端的連接,同時(shí)定義指令發(fā)送方式,服務(wù)網(wǎng)頁(URL)和請(qǐng)求權(quán)限等。
3、發(fā)送指令。
4、等待并接收服務(wù)端返回的處理結(jié)果。
5、釋放XMLHTTP對(duì)象
方法
open(數(shù)據(jù)傳送方式(GET/POST/HEAD),服務(wù)器URL,是否異步執(zhí)行,[用戶名],[口令])
如:
open("GET","http://www.sohu.com",true)
send(content)
可以是XML格式數(shù)據(jù),也可以是字符串,流,或者一個(gè)無符號(hào)整數(shù)數(shù)組。也可以省略,讓指令通過Open方法的URL參數(shù)代入。
如:send(null);
setRequestHeader(HTTP 頭,HTTP 頭值)
如:xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
abort()取消當(dāng)前 HTTP 請(qǐng)求
getAllResponseHeaders ()
從響應(yīng)信息中檢索所有的HTTP 頭字段
getResponseHeader(HTTP 頭)
從響應(yīng)信息正文中獲得一個(gè) HTTP 標(biāo)頭值
屬性
onreadystatechange:用以狀態(tài)改變后所要作的處理的事件句柄。
readyState 異步操作的狀態(tài):未初始化(0),正在加載(1),已加載(2),交互(3),已完成(4)
responseBody:返回為無符號(hào)整數(shù)數(shù)組。
responseStream:返回為IStream流。
responseText :返回字符串。
responseXML:返回為XML格式數(shù)據(jù)。
status:服務(wù)器返回的HTTP狀態(tài)碼
statusText :服務(wù)器HTTP響應(yīng)行狀態(tài)
說明
1.同步和異步
同步狀態(tài)下發(fā)送http請(qǐng)求后,只有當(dāng)客戶端接收到來自服務(wù)端的全部應(yīng)答數(shù)據(jù)或協(xié)議棧超時(shí)返回!反之異步狀態(tài)下,直接返回。在異步方式下數(shù)據(jù)包一旦發(fā)送完畢就結(jié)束send進(jìn)程客戶端執(zhí)行其他的操作,而在同步方式下客戶端要等到服務(wù)器返回確認(rèn)消息后才結(jié)束send進(jìn)程。實(shí)際運(yùn)用中我們根據(jù)實(shí)際情況使用同步或異步,注意了如果設(shè)為同步狀態(tài)可能因?yàn)榉?wù)器返回?cái)?shù)據(jù)量大或響應(yīng)慢而導(dǎo)致不必要的長時(shí)間等待!
2.POST和GET
用"POST"方式發(fā)送數(shù)據(jù).可以大到4MB "GET"只能256KB
========================================================
一個(gè)實(shí)例:
<!--Request.htm----------------------------------------------------------->
<html>
<head>
<title>Ajax應(yīng)用實(shí)例</title>
<script type="text/javaScript">
var xmlHttp;
var requestType="";
function createXMLHttpRequest(){
if(window.ActiveXObject){
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest){
xmlHttp = new XMLHttpRequest();
}
}
function startRequest(theRequestType){
requestType = theRequestType;
createXMLHttpRequest();
xmlHttp.onreadystatechange = myCallback;
xmlHttp.open("GET","Response.xml",true);
xmlHttp.send(null);
}
function myCallback(){
if(xmlHttp.readyState==4){
if(xmlHttp.status==200){
if(requestType=="all")
listAll();
else if(requestType=="north")
listNorth();
}
}
}
function listAll(){
var xmlDoc = xmlHttp.responseXML;
var allProvs = xmlDoc.getElementsByTagName("prov");
outputList("all",allProvs);
}
function listNorth(){
var xmlDoc = xmlHttp.responseXML;
var north = xmlDoc.getElementsByTagName("north")[0];
var northProvs = north.getElementsByTagname("prov");
outputList("north",northProvs);
}
function outputList(title,provs){
var out=title;
var currentProv = null;
for(var i=0;i<provs.length;i++){
currentProv = provs[i];
out = out + “<br/>” + currentProv.childNodes[0].nodeValue;
}
document.getElementById(title).innerHTML = out;
}
</script>
</head>
<body>
<h1> Ajax應(yīng)用實(shí)例</h1>
<form action="#">
<input type="button" value="列出所有沿海省市"
conclick="startRequest('all'); "/>
<div id="all"></div>
<input type="button" value="列出江北沿海省市"
conclick="startRequest('north'); "/>
<div id="north"></div>
</form>
</body>
</html>
<!--Response.xml---------------------------------------------------------->
<?xml version="1.0"encoding="utf-8" ?>
<provs>
<north>
<prov>遼寧</prov><prov>河北</prov><prov>天津</prov>
<prov>山東</prov><prov>江蘇</prov>
</north>
<south>
<prov>浙江</prov><prov>福建</prov><prov>廣東</prov>
<prov>廣西</prov><prov>海南</prov><prov>上海</prov>
<prov>臺(tái)灣</prov><prov>香港</prov><prov>澳門</prov>
</south>
</provs>