Ajax是Asynchronous javascript and XML的縮寫,。Ajax是幾項(xiàng)技術(shù)按一定的方式組合在一在同共的協(xié)作中發(fā)揮各自的作用,它包括
Ajax的工作原理相當(dāng)于在用戶和服務(wù)器之間加了—個(gè)中間層,使用戶操作與服務(wù)器響應(yīng)異步化。并不是所有的用戶請(qǐng)求都提交給服務(wù)器,像—些數(shù)據(jù)驗(yàn)證和數(shù)據(jù)處理等都交給Ajax引擎自己來(lái)做,只有確定需要從服務(wù)器讀取新數(shù)據(jù)時(shí)再由Ajax引擎代為向服務(wù)器提交請(qǐng)求,。
核心只有javascript,、XMLHTTPRequest和DOM,如果所用數(shù)據(jù)格式為XML的話,,還可以再加上XML這一項(xiàng)(Ajax從服務(wù)器端返回的數(shù)據(jù)可以是XML格式,,也可以是文本等其他格式)。
1 //處理瀏覽器,,用來(lái)選擇不同的XML讀取函數(shù)
2 var agt = navigator.userAgent.toLowerCase();
3 var is_opera = (agt.indexOf("opera") != -1);
4 var is_ie = (agt.indexOf("msie") != -1) && document.all && !is_opera;
5 var is_ie5 = (agt.indexOf("msie 5") != -1) && document.all;
2、創(chuàng)建請(qǐng)求(GET和POST)
1 //創(chuàng)建Get請(qǐng)求
2 function StartGETRequest(url, handler)
3 {
4 xmlhttp = null;
5 if (is_ie) {
6 var control = (is_ie5) ? "Microsoft.XMLHTTP" : "Msxml2.XMLHTTP";
7 try {
8 xmlhttp = new ActiveXObject(control);
9 } catch(e) {
10 alert("You need to enable active scripting and activeX controls");
11 DumpException(e);
12 }
13 } else {
14 xmlhttp = new XMLHttpRequest();
15 }
16 xmlhttp.onreadystatechange = function() {handler();}
17 if (url.indexOf("?") != -1){
18 var urltemp = url + "&rand=" + UniqueNum();
19 } else {
20 var urltemp = url + "?rand=" + UniqueNum();
21 }
22 xmlhttp.open(‘GET‘, urltemp, true);
23 xmlhttp.send(null);
24 }
25
26 //創(chuàng)建POST請(qǐng)求
27 function StartPOSTRequest(url, data, handler)
28 {
29 xmlhttp = null;
30 if (is_ie) {
31 var control = (is_ie5) ? "Microsoft.XMLHTTP" : "Msxml2.XMLHTTP";
32 try {
33 xmlhttp = new ActiveXObject(control);
34 } catch(e) {
35 alert("You need to enable active scripting and activeX controls");
36 DumpException(e);
37 }
38 } else {
39 xmlhttp = new XMLHttpRequest();
40 }
41 xmlhttp.onreadystatechange = function() {handler();}
42 xmlhttp.open(‘POST‘, url, true);
43 if (typeof(xmlhttp.setRequestHeader) != "undefined") {
44 xmlhttp.setRequestHeader(‘Content-Type‘, ‘a(chǎn)pplication/x-www-form-urlencoded; Charset=GB2312‘);
45 }
46 xmlhttp.send(data);
47 }
1
2 function getCommentHtmlList(qid, aid)
3 {
4 var strText;
5 if (xmlhttp.readyState == 4){
6 if (xmlhttp.status == 200){
7 strText = xmlhttp.responseText;//接受文本數(shù)據(jù)
8 strText = xmlhttp.responseXml;//接受Xml數(shù)據(jù)
9 document.getElementById("commentsec").innerHTML = strText; //顯示數(shù)據(jù)
10 }else{
11 //Alert(“網(wǎng)絡(luò)錯(cuò)誤,!”);
12 alert("Problem: " + xmlhttp.statusText);
13 }
14 }
15 }
16
至此一個(gè)流程完畢
4、重要函數(shù)應(yīng)用解釋
XMLHttpRequest
最早應(yīng)用XMLHTTP的是微軟,IE(IE5以上)通過(guò)允許開發(fā)人員在Web頁(yè)面內(nèi)部使用XMLHTTP ActiveX組件擴(kuò)展自身的功能,開發(fā)人員可以不用從當(dāng)前的Web頁(yè)面導(dǎo)航而直接傳輸數(shù)據(jù)到服務(wù)器上或者從服務(wù)器取數(shù)據(jù),。這個(gè)功能是很重要的,因?yàn)樗鼛椭鷾p少了無(wú)狀態(tài)連接的痛苦,它還可以排除下載冗余HTML的需要,從而提高進(jìn)程的速度,。Mozilla(Mozilla1.0以上及NetScape7以上)做出的回應(yīng)是創(chuàng)建它自己的繼承XML代理類:XMLHttpRequest類。Konqueror (和Safari v1.2,同樣也是基于KHTML的瀏覽器)也支持XMLHttpRequest對(duì)象,而Opera也將在其v7.6x+以后的版本中支持XMLHttpRequest對(duì)象,。對(duì)于大多數(shù)情況,,XMLHttpRequest對(duì)象和XMLHTTP組件很相似,方法和屬性也類似,只是有一小部分屬性不支持。
XMLHttpRequest 對(duì)象方法 方法 描述
abort() 停止當(dāng)前請(qǐng)求
getAllResponseHeaders() 作為字符串返問(wèn)完整的headers
getResponseHeader("headerLabel") 作為字符串返問(wèn)單個(gè)的header標(biāo)簽
open("method","URL"[,asyncFlag[,"userName"[, "password"]]]) 設(shè)置未決的請(qǐng)求的目標(biāo) URL, 方法, 和其他參數(shù)
send(content) 發(fā)送請(qǐng)求
setRequestHeader("label", "value") 設(shè)置header并和請(qǐng)求一起發(fā)送
onreadystatechange 狀態(tài)改變的事件觸發(fā)器
readyState 對(duì)象狀態(tài)(integer):
0 = 未初始化
1 = 讀取中
2 = 已讀取
3 = 交互中
4 = 完成
responseText 服務(wù)器進(jìn)程返回?cái)?shù)據(jù)的文本版本
responseXML 服務(wù)器進(jìn)程返回?cái)?shù)據(jù)的兼容DOM的XML文檔對(duì)象
status 服務(wù)器返回的狀態(tài)碼, 如:404 = "文件末找到" ,、200 ="成功"
statusText 服務(wù)器返回的狀態(tài)文本信息
3.AJAX的好處:
1,、減輕服務(wù)器的負(fù)擔(dān),減少帶寬消耗
因?yàn)锳jax的根本理念是“按需取數(shù)據(jù)”,,所以最大可能在減少了冗余請(qǐng)求和響影對(duì)服務(wù)器造成的負(fù)擔(dān),;也可以把以前的一些服務(wù)器負(fù)擔(dān)的工作轉(zhuǎn)嫁到客戶端,利于客戶端閑置的處理能力來(lái)處理,,減輕服務(wù)器和帶寬的負(fù)擔(dān),,節(jié)約空間和帶寬租用成本;
2,、無(wú)刷新更新頁(yè)面,,減少用戶實(shí)際和心理等待時(shí)間;
首先,,“按需取數(shù)據(jù)”的模式減少了數(shù)據(jù)的實(shí)際讀取量,。
其次,即使要讀取比較大的數(shù)據(jù),,也不用像RELOAD一樣出現(xiàn)白屏的情況,,由于Ajax是用XMLHTTP發(fā)送請(qǐng)求得到服務(wù)端應(yīng)答數(shù)據(jù),,在不重新載入整個(gè)頁(yè)面的情況下用javascript操作DOM最終更新頁(yè)面的,所以在讀取數(shù)據(jù)的過(guò)程中,,用戶所面對(duì)的也不是白屏,,而是原來(lái)的頁(yè)面狀態(tài)(或者可以加一個(gè)LOADING的提示框讓用戶了解數(shù)據(jù)讀取的狀態(tài)),只有當(dāng)接收到全部數(shù)據(jù)后才更新相應(yīng)部分的內(nèi)容,,而這種更新也是瞬間的,,用戶幾乎感覺(jué)不到。
3,、基于標(biāo)準(zhǔn)化并被廣泛支持,,不需要插件或下載小程序;
實(shí)際驗(yàn)證,,目前支持的瀏覽器是IE5以上,,Opera(對(duì)post處理有點(diǎn)問(wèn)題),Mozilla Firefox等,。并且在加載的時(shí)候不會(huì)提示用戶需要下載程序,,減少用戶的反感。
4,、Ajax使WEB中的界面與應(yīng)用分離(也可以說(shuō)是數(shù)據(jù)與呈現(xiàn)分離),;
4.AJAX的問(wèn)題:
1、一些手持設(shè)備(如手機(jī),、PDA等)現(xiàn)在還不能很好的支持Ajax,;
2、用javascript作的Ajax引擎,,javascript的兼容性和DeBug都是讓人頭痛的事;
3,、Ajax的無(wú)刷新重載,,由于頁(yè)面的變化沒(méi)有刷新重載那么明顯,所以容易給用戶帶來(lái)困擾――用戶不太清楚現(xiàn)在的數(shù)據(jù)是新的還是已經(jīng)更新過(guò)的,;現(xiàn)有的解決有:在相關(guān)位置提示,、數(shù)據(jù)更新的區(qū)域設(shè)計(jì)得比較明顯、數(shù)據(jù)更新后給用戶提示等,;
4,、對(duì)流媒體的支持沒(méi)有FLASH、Java Applet好,;
5.使用中遇到的問(wèn)題:
1,、編碼問(wèn)題:
我們的網(wǎng)頁(yè)編碼都是使用的GB2312格式,但是在默認(rèn)的情況下AJAX使用的UTF-8格式的數(shù)據(jù),,這樣就給我們?cè)跀?shù)據(jù)的保存方面造成問(wèn)題,,需要轉(zhuǎn)碼,。
例子:知識(shí)人最終頁(yè)面的評(píng)論交互。
比如php下可以用 mb_convert_encoding("中國(guó)","UTF-8","GB2312") 將漢字轉(zhuǎn)成 UTF-8編碼,,或者(iconv也可)
6.網(wǎng)絡(luò)里面關(guān)于ajax的說(shuō)法
1,、對(duì)搜索引擎的支持不好
2、編寫復(fù)雜,、容易出錯(cuò),,調(diào)試器難找,幾乎沒(méi)有,,只有這個(gè)SplineTech JavaScript HTML Debugger,, 地址:http://www./javascript_debugger/javascript_debugger.asp
3、冗余代碼更多了,,層層包含js文件是AJAX的通病,,再加上以往的很多服務(wù)端代碼現(xiàn)在放到了客戶端,所以每次打開一個(gè)頁(yè)面會(huì)包含很多的無(wú)用的js文件也一同下載下來(lái),。
4,、破壞了Web的原有標(biāo)準(zhǔn),<span onclick="location.href=‘detail/‘;">點(diǎn)擊查看全部</a>,,這個(gè)可以替代A標(biāo)簽,。
5、XML只是用來(lái)打幌子,,xml有一個(gè)致命的缺點(diǎn),,那就是加載的資源耗費(fèi),這好像是所有平臺(tái)下xml的通病,。google map沒(méi)有用xml,,而是用了原生的javascript數(shù)組。
6.同時(shí)要注意緩存的問(wèn)題
>>CODE
1 <script language=javascript>
2 var agt = navigator.userAgent.toLowerCase();
3 var is_opera = (agt.indexOf("opera") != -1);
4 var is_ie = (agt.indexOf("msie") != -1) && document.all && !is_opera;
5 var is_ie5 = (agt.indexOf("msie 5") != -1) && document.all;
6
7 var thisObj=document.getElementById("TAG_USER_STOCK");
8
9
10 function StartGETRequest(url,page,tag)
11 {
12 thisObj=document.getElementById(tag);
13 xmlhttp = null;
14 if (is_ie) {
15 var control = (is_ie5) ? "Microsoft.XMLHTTP" : "Msxml2.XMLHTTP";
16 try {
17 xmlhttp = new ActiveXObject(control);
18 } catch(e) {
19 alert("You need to enable active scripting and activeX controls");
20 DumpException(e);
21 }
22 } else {
23 xmlhttp = new XMLHttpRequest();
24 }
25 xmlhttp.onreadystatechange = getCommentHtmlList;
26
27 url=url+"?page="+page;
28
29 xmlhttp.open(‘GET‘, url, true);
30 xmlhttp.send(null);
31 }
32 function getCommentHtmlList()
33 {
34 var strText;
35 if (xmlhttp.readyState == 4){
36 if (xmlhttp.status == 200){
37 strText = xmlhttp.responseText;//接受文本數(shù)據(jù)
38 thisObj.innerHTML = strText; //顯示數(shù)據(jù)
39 }else{
40 alert("Problem: " + xmlhttp.statusText);
41 }
42 }
43 }
44 </script>
45