1、ajax技術(shù)的背景
不可否認(rèn),ajax技術(shù)的流行得益于google的大力推廣,正是由于google earth、google suggest以及gmail等對(duì)ajax技術(shù)的廣泛應(yīng)用,催生了ajax的流行。而這也讓微軟感到無(wú)比的尷尬,因?yàn)樵缭?7年,微軟便已經(jīng)發(fā)明了ajax中的關(guān)鍵技術(shù),并且在99年IE5推出之時(shí),它便開(kāi)始支持XmlHttpRequest對(duì)象,并且微軟之前已經(jīng)開(kāi)始在它的一些產(chǎn)品中應(yīng)用ajax,比如說(shuō)MSDN網(wǎng)站菜單中的一些應(yīng)用。遺憾的是,不知道出于什么想法,當(dāng)時(shí)微軟發(fā)明了ajax的核心技術(shù)之后,并沒(méi)有看到它的潛力而加以發(fā)展和推廣,而是將它擱置起來(lái)。對(duì)于這一點(diǎn)來(lái)說(shuō),我個(gè)人是覺(jué)得非常奇怪的,因?yàn)橐晕④浀馁Y源和它的戰(zhàn)略眼光來(lái)說(shuō),應(yīng)該不會(huì)看不到ajax技術(shù)的前景,唯一的解釋也許就是因?yàn)楫?dāng)時(shí)它的主要競(jìng)爭(zhēng)對(duì)手Netscape的消失反而使它變得麻痹和遲鈍,畢竟巨人也有打盹的時(shí)候,比如IBM曾經(jīng)在對(duì)微軟戰(zhàn)略上的失誤。正是這一次的失誤,成就了它現(xiàn)在的競(jìng)爭(zhēng)對(duì)手google在ajax方面的領(lǐng)先地位,而事實(shí)上google目前在ajax技術(shù)方面的領(lǐng)先是微軟所無(wú)法達(dá)到的,這一點(diǎn)在后面我講述ajax缺陷的時(shí)候也會(huì)提到?,F(xiàn)在微軟也意識(shí)到了這個(gè)問(wèn)題,因此它也開(kāi)始在ajax領(lǐng)域奮起直追,比如說(shuō)推出它自己的ajax框架atlas,并且在.NET2.0也提供了一個(gè)用來(lái)實(shí)現(xiàn)異步回調(diào)的接口,即ICallBack接口。那么微軟為什么對(duì)自己在ajax方面的落后如此緊張呢?現(xiàn)在就讓我們來(lái)分析一下ajax技術(shù)后面隱藏的深刻意義。
2、ajax技術(shù)的意義
我們?cè)谄綍r(shí)的開(kāi)發(fā)中都多多少少的接觸或者應(yīng)用到了ajax,談到ajax技術(shù)的意義,我們關(guān)注得最多的毫無(wú)疑問(wèn)是提升用戶(hù)的體驗(yàn)。但是,如果我們結(jié)合將來(lái)電腦和互聯(lián)網(wǎng)的發(fā)展趨勢(shì),我們會(huì)發(fā)現(xiàn)ajax技術(shù)在某些方面正好代表了這種趨勢(shì)。為什么這樣說(shuō)呢?我們知道,自從電腦出現(xiàn)以來(lái),一直是桌面軟件占據(jù)著絕對(duì)主導(dǎo)的地位,但是互聯(lián)網(wǎng)的出現(xiàn)和成功使這一切開(kāi)始發(fā)生著微妙的變化。相當(dāng)一部分的人都相信,遲早有一天,數(shù)據(jù)和電腦軟件將會(huì)從桌面轉(zhuǎn)移到互聯(lián)網(wǎng)。也就是說(shuō),將來(lái)的電腦有可能拋棄笨重的硬盤(pán),而直接從互聯(lián)網(wǎng)來(lái)獲取數(shù)據(jù)和服務(wù),我記得我念大學(xué)的時(shí)候,有位教授給我們上課的時(shí)候,曾經(jīng)設(shè)想過(guò)這樣一種情景,也許在將來(lái)的電腦桌面上,沒(méi)有任何多余的軟件和程序,而僅僅只有一個(gè)IE,雖然現(xiàn)在看起來(lái)我們距離這一天還很遙遠(yuǎn),并且這其中還有很多的問(wèn)題需要解決,但是我覺(jué)得這個(gè)并非夢(mèng)想,而是遲早將實(shí)現(xiàn)的現(xiàn)實(shí)。那么,這其中的主要問(wèn)題就是互聯(lián)網(wǎng)的連接不穩(wěn)定,誰(shuí)也不愿意看著自己的電腦從服務(wù)器一點(diǎn)一滴的下載數(shù)據(jù),那么,ajax是不是解決了這個(gè)問(wèn)題呢,說(shuō)實(shí)話,與其說(shuō)ajax解決了這個(gè)問(wèn)題,倒不如它只是掩蓋了這個(gè)問(wèn)題,它只是在服務(wù)器和客戶(hù)端之間充當(dāng)了一個(gè)緩沖器,讓用戶(hù)誤以為服務(wù)沒(méi)有中斷。精確的說(shuō),ajax并不能提高從服務(wù)器端下載數(shù)據(jù)的速度,而只是使這個(gè)等待不那么令人沮喪。但是正是這一點(diǎn)就足以產(chǎn)生巨大的影響和震動(dòng),它實(shí)際上也對(duì)桌面軟件產(chǎn)生了巨大的沖擊。這一點(diǎn)我用一個(gè)例子來(lái)說(shuō)明,我們可以比較一下Outlook Express和Gmail,前者是典型的桌面軟件,后者是ajax所實(shí)現(xiàn)的B/S模式,實(shí)際上后者目前已經(jīng)在慢慢取代前者了,Gmail在收發(fā)郵件的時(shí)候已經(jīng)和Outlook Express的功能幾乎沒(méi)有差別了,而且它不需要安裝客戶(hù)端程序。這就是為什么微軟對(duì)ajax所帶來(lái)的沖擊有著如此的恐懼心理,并且在它前不久所進(jìn)行的調(diào)查之中,將google看做他們未來(lái)十年內(nèi)的主要競(jìng)爭(zhēng)對(duì)手的主要原因之一。當(dāng)然,這種變化也并不會(huì)將桌面軟件全部淘汰,現(xiàn)有的瀏覽器還沒(méi)有一個(gè)能像PhotoShop等桌面程序那樣處理復(fù)雜的圖像。但是我們也不能忽視它帶來(lái)的影響和沖擊。
3、關(guān)于ajax的名字
ajax 的全稱(chēng)是Asynchronous JavaScript and XML,其中,Asynchronous 是異步的意思,它有別于傳統(tǒng)web開(kāi)發(fā)中采用的同步的方式。
關(guān)于同步和異步
異步傳輸是面向字符的傳輸,它的單位是字符;而同步傳輸是面向比特的傳輸,它的單位是楨,它傳輸?shù)臅r(shí)候要求接受方和發(fā)送方的時(shí)鐘是保持一致的。
具體來(lái)說(shuō),異步傳輸是將比特分成小組來(lái)進(jìn)行傳送。一般每個(gè)小組是一個(gè)8位字符,在每個(gè)小組的頭部和尾部都有一個(gè)開(kāi)始位和一個(gè)停止位,它在傳送過(guò)程中接收方和發(fā)送方的時(shí)鐘不要求一致,也就是說(shuō),發(fā)送方可以在任何時(shí)刻發(fā)送這些小組,而接收方并不知道它什么時(shí)候到達(dá)。一個(gè)最明顯的例子就是計(jì)算機(jī)鍵盤(pán)和主機(jī)的通信,按下一個(gè)鍵的同時(shí)向主機(jī)發(fā)送一個(gè)8比特位的ASCII代碼,鍵盤(pán)可以在任何時(shí)刻發(fā)送代碼,這取決于用戶(hù)的輸入速度,內(nèi)部的硬件必須能夠在任何時(shí)刻接收一個(gè)鍵入的字符。這是一個(gè)典型的異步傳輸過(guò)程。異步傳輸存在一個(gè)潛在的問(wèn)題,即接收方并不知道數(shù)據(jù)會(huì)在什么時(shí)候到達(dá)。在它檢測(cè)到數(shù)據(jù)并做出響應(yīng)之前,第一個(gè)比特已經(jīng)過(guò)去了。這就像有人出乎意料地從后面走上來(lái)跟你說(shuō)話,而你沒(méi)來(lái)得及反應(yīng)過(guò)來(lái),漏掉了最前面的幾個(gè)詞。因此,每次異步傳輸?shù)男畔⒍家砸粋€(gè)起始位開(kāi)頭,它通知接收方數(shù)據(jù)已經(jīng)到達(dá)了,這就給了接收方響應(yīng)、接收和緩存數(shù)據(jù)比特的時(shí)間;在傳輸結(jié)束時(shí),一個(gè)停止位表示該次傳輸信息的終止。按照慣例,空閑(沒(méi)有傳送數(shù)據(jù))的線路實(shí)際攜帶著一個(gè)代表二進(jìn)制1的信號(hào)。步傳輸?shù)拈_(kāi)始位使信號(hào)變成0,其他的比特位使信號(hào)隨傳輸?shù)臄?shù)據(jù)信息而變化。最后,停止位使信號(hào)重新變回1,該信號(hào)一直保持到下一個(gè)開(kāi)始位到達(dá)。例如在鍵盤(pán)上數(shù)字“1”,按照8比特位的擴(kuò)展ASCII編碼,將發(fā)送“00110001”,同時(shí)需要在8比特位的前面加一個(gè)起始位,后面一個(gè)停止位。
同步傳輸?shù)谋忍胤纸M要大得多。它不是獨(dú)立地發(fā)送每個(gè)字符,每個(gè)字符都有自己的開(kāi)始位和停止位,而是把它們組合起來(lái)一起發(fā)送。我們將這些組合稱(chēng)為數(shù)據(jù)幀,或簡(jiǎn)稱(chēng)為幀。
數(shù)據(jù)幀的第一部分包含一組同步字符,它是一個(gè)獨(dú)特的比特組合,類(lèi)似于前面提到的起始位,用于通知接收方一個(gè)幀已經(jīng)到達(dá),但它同時(shí)還能確保接收方的采樣速度和比特的到達(dá)速度保持一致,使收發(fā)雙方進(jìn)入同步。
幀的最后一部分是一個(gè)幀結(jié)束標(biāo)記。與同步字符一樣,它也是一個(gè)獨(dú)特的比特串,類(lèi)似于前面提到的停止位,用于表示在下一幀開(kāi)始之前沒(méi)有別的即將到達(dá)的數(shù)據(jù)了。
同步傳輸通常要比異步傳輸快速得多。接收方不必對(duì)每個(gè)字符進(jìn)行開(kāi)始和停止的操作。一旦檢測(cè)到幀同步字符,它就在接下來(lái)的數(shù)據(jù)到達(dá)時(shí)接收它們。另外,同步傳輸?shù)拈_(kāi)銷(xiāo)也比較少。例如,一個(gè)典型的幀可能有500字節(jié)(即4000比特)的數(shù)據(jù),其中可能只包含100比特的開(kāi)銷(xiāo)。這時(shí),增加的比特位使傳輸?shù)谋忍乜倲?shù)增加2.5%,這與異步傳輸中25 %的增值要小得多。隨著數(shù)據(jù)幀中實(shí)際數(shù)據(jù)比特位的增加,開(kāi)銷(xiāo)比特所占的百分比將相應(yīng)地減少。但是,數(shù)據(jù)比特位越長(zhǎng),緩存數(shù)據(jù)所需要的緩沖區(qū)也越大,這就限制了一個(gè)幀的大小。另外,幀越大,它占據(jù)傳輸媒體的連續(xù)時(shí)間也越長(zhǎng)。在極端的情況下,這將導(dǎo)致其他用戶(hù)等得太久。
個(gè)小時(shí),在這10個(gè)小時(shí)內(nèi)水沒(méi)有完全斷,只是流量比原來(lái)小了很多,在10個(gè)小時(shí)后恢復(fù)正常流量,那么,如果是你你會(huì)選擇哪種方式呢?顯然是后者。
4、ajax所包含的技術(shù)
大家都知道ajax并非一種新的技術(shù),而是幾種原有技術(shù)的結(jié)合體。它由下列技術(shù)組合而成。
1.使用CSS和XHTML來(lái)表示。
2. 使用DOM模型來(lái)交互和動(dòng)態(tài)顯示。
3.使用XMLHttpRequest來(lái)和服務(wù)器進(jìn)行異步通信。
4.使用javascript來(lái)綁定和調(diào)用。
在上面幾中技術(shù)中,除了XmlHttpRequest對(duì)象以外,其它所有的技術(shù)都是基于web標(biāo)準(zhǔn)并且已經(jīng)得到了廣泛使用的,XMLHttpRequest雖然目前還沒(méi)有被W3C所采納,但是它已經(jīng)是一個(gè)事實(shí)的標(biāo)準(zhǔn),因?yàn)槟壳皫缀跛械闹髁鳛g覽器都支持它。
5、ajax原理和XmlHttpRequest對(duì)象
Ajax的原理簡(jiǎn)單來(lái)說(shuō)通過(guò)XmlHttpRequest對(duì)象來(lái)向服務(wù)器發(fā)異步請(qǐng)求,從服務(wù)器獲得數(shù)據(jù),然后用javascript來(lái)操作DOM而更新頁(yè)面。這其中最關(guān)鍵的一步就是從服務(wù)器獲得請(qǐng)求數(shù)據(jù)。要清楚這個(gè)過(guò)程和原理,我們必須對(duì) XMLHttpRequest有所了解。
XMLHttpRequest是ajax的核心機(jī)制,它是在IE5中首先引入的,是一種支持異步請(qǐng)求的技術(shù)。簡(jiǎn)單的說(shuō),也就是javascript可以及時(shí)向服務(wù)器提出請(qǐng)求和處理響應(yīng),而不阻塞用戶(hù)。達(dá)到無(wú)刷新的效果。
所以我們先從XMLHttpRequest講起,來(lái)看看它的工作原理。
首先,我們先來(lái)看看XMLHttpRequest這個(gè)對(duì)象的屬性。
它的屬性有:
onreadystatechange 每次狀態(tài)改變所觸發(fā)事件的事件處理程序。
responseText從服務(wù)器進(jìn)程返回?cái)?shù)據(jù)的字符串形式。
responseXML從服務(wù)器進(jìn)程返回的DOM兼容的文檔數(shù)據(jù)對(duì)象。
status從服務(wù)器返回的數(shù)字代碼,比如常見(jiàn)的404(未找到)和200(已就緒)
status Text伴隨狀態(tài)碼的字符串信息
readyState對(duì)象狀態(tài)值
0 (未初始化) 對(duì)象已建立,但是尚未初始化(尚未調(diào)用open方法)
1 (初始化) 對(duì)象已建立,尚未調(diào)用send方法
2 (發(fā)送數(shù)據(jù)) send方法已調(diào)用,但是當(dāng)前的狀態(tài)及http頭未知
3 (數(shù)據(jù)傳送中) 已接收部分?jǐn)?shù)據(jù),因?yàn)轫憫?yīng)及http頭不全,這時(shí)通過(guò)responseBody和responseText獲取部分?jǐn)?shù)據(jù)會(huì)出現(xiàn)錯(cuò)誤,
4 (完成) 數(shù)據(jù)接收完畢,此時(shí)可以通過(guò)通過(guò)responseXml和responseText獲取完整的回應(yīng)數(shù)據(jù)
但是,由于各瀏覽器之間存在差異,所以創(chuàng)建一個(gè)XMLHttpRequest對(duì)象可能需要不同的方法。這個(gè)差異主要體現(xiàn)在IE和其它瀏覽器之間。下面是一個(gè)比較標(biāo)準(zhǔn)的創(chuàng)建XMLHttpRequest對(duì)象的方法。
function CreateXmlHttp()
{
//非IE瀏覽器創(chuàng)建XmlHttpRequest對(duì)象
if(window.XmlHttpRequest)
{
xmlhttp=new XmlHttpRequest();
}
//IE瀏覽器創(chuàng)建XmlHttpRequest對(duì)象
if(window.ActiveXObject)
{
try
{
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch(e)
{
try{
xmlhttp=new ActiveXObject("msxml2.XMLHTTP");
}
catch(ex){}
}
}
}
function TestAjax()
{
var data=document.getElementByIdx("username").value;
CreateXmlHttp();
if(!xmlhttp)
{
alert("創(chuàng)建xmlhttp對(duì)象異常!");
return false;
}
xmlhttp.open("POST",url,false);
xmlhttp.onreadystatechange=function()
{
if(xmlhttp.readyState==4)
{
document.getElementByIdx("user1").innerHTML="數(shù)據(jù)正在加載...";
if(xmlhttp.status==200)
{
document.write(xmlhttp.responseText);
}
}
}
xmlhttp.send();
}
如上所示,函數(shù)首先檢查XMLHttpRequest的整體狀態(tài)并且保證它已經(jīng)完成(readyStatus=4),即數(shù)據(jù)已經(jīng)發(fā)送完畢。然后根據(jù)服務(wù)器的設(shè)定詢(xún)問(wèn)請(qǐng)求狀態(tài),如果一切已經(jīng)就緒(status=200),那么就執(zhí)行下面需要的操作。
對(duì)于XmlHttpRequest的兩個(gè)方法,open和send,其中open方法指定了:
a、向服務(wù)器提交數(shù)據(jù)的類(lèi)型,即post還是get。
b、請(qǐng)求的url地址和傳遞的參數(shù)。
c、傳輸方式,false為同步,true為異步。默認(rèn)為true。如果是異步通信方式(true),客戶(hù)機(jī)就不等待服務(wù)器的響應(yīng);如果是同步方式(false),客戶(hù)機(jī)就要等到服務(wù)器返回消息后才去執(zhí)行其他操作。我們需要根據(jù)實(shí)際需要來(lái)指定同步方式,在某些頁(yè)面中,可能會(huì)發(fā)出多個(gè)請(qǐng)求,甚至是有組織有計(jì)劃有隊(duì)形大規(guī)模的高強(qiáng)度的request,而后一個(gè)是會(huì)覆蓋前一個(gè)的,這個(gè)時(shí)候當(dāng)然要指定同步方式。
Send方法用來(lái)發(fā)送請(qǐng)求。
知道了XMLHttpRequest的工作流程,我們可以看出,XMLHttpRequest是完全用來(lái)向服務(wù)器發(fā)出一個(gè)請(qǐng)求的,它的作用也局限于此,但它的作用是整個(gè)ajax實(shí)現(xiàn)的關(guān)鍵,因?yàn)閍jax無(wú)非是兩個(gè)過(guò)程,發(fā)出請(qǐng)求和響應(yīng)請(qǐng)求。并且它完全是一種客戶(hù)端的技術(shù)。而XMLHttpRequest正是處理了服務(wù)器端和客戶(hù)端通信的問(wèn)題所以才會(huì)如此的重要。
現(xiàn)在,我們對(duì)ajax的原理大概可以有一個(gè)了解了。我們可以把服務(wù)器端看成一個(gè)數(shù)據(jù)接口,它返回的是一個(gè)純文本流,當(dāng)然,這個(gè)文本流可以是XML格式,可以是Html,可以是Javascript代碼,也可以只是一個(gè)字符串。這時(shí)候,XMLHttpRequest向服務(wù)器端請(qǐng)求這個(gè)頁(yè)面,服務(wù)器端將文本的結(jié)果寫(xiě)入頁(yè)面,這和普通的web開(kāi)發(fā)流程是一樣的,不同的是,客戶(hù)端在異步獲取這個(gè)結(jié)果后,不是直接顯示在頁(yè)面,而是先由javascript來(lái)處理,然后再顯示在頁(yè)面。至于現(xiàn)在流行的很多ajax控件,比如magicajax等,可以返回DataSet等其它數(shù)據(jù)類(lèi)型,只是將這個(gè)過(guò)程封裝了的結(jié)果,本質(zhì)上他們并沒(méi)有什么太大的區(qū)別。
6、ajax的優(yōu)點(diǎn)
Ajax的給我們帶來(lái)的好處大家基本上都深有體會(huì),在這里我只簡(jiǎn)單的講幾點(diǎn):
1、最大的一點(diǎn)是頁(yè)面無(wú)刷新,在頁(yè)面內(nèi)與服務(wù)器通信,給用戶(hù)的體驗(yàn)非常好。
2、使用異步方式與服務(wù)器通信,不需要打斷用戶(hù)的操作,具有更加迅速的響應(yīng)能力。
3、可以把以前一些服務(wù)器負(fù)擔(dān)的工作轉(zhuǎn)嫁到客戶(hù)端,利用客戶(hù)端閑置的能力來(lái)處理,減輕服務(wù)器和帶寬的負(fù)擔(dān),節(jié)約空間和寬帶租用成本。并且減輕服務(wù)器的負(fù)擔(dān),ajax的原則是“按需取數(shù)據(jù)”,可以最大程度的減少冗余請(qǐng)求,和響應(yīng)對(duì)服務(wù)器造成的負(fù)擔(dān)。
4、基于標(biāo)準(zhǔn)化的并被廣泛支持的技術(shù),不需要下載插件或者小程序。
7、ajax的缺點(diǎn)
下面我著重講一講ajax的缺陷,因?yàn)槠綍r(shí)我們大多注意的都是ajax給我們所帶來(lái)的好處諸如用戶(hù)體驗(yàn)的提升。而對(duì)ajax所帶來(lái)的缺陷有所忽視。
下面所闡述的ajax的缺陷都是它先天所產(chǎn)生的。
1、ajax干掉了back按鈕,即對(duì)瀏覽器后退機(jī)制的破壞。后退按鈕是一個(gè)標(biāo)準(zhǔn)的web站點(diǎn)的重要功能,但是它沒(méi)法和js進(jìn)行很好的合作。這是ajax所帶來(lái)的一個(gè)比較嚴(yán)重的問(wèn)題,因?yàn)橛脩?hù)往往是希望能夠通過(guò)后退來(lái)取消前一次操作的。那么對(duì)于這個(gè)問(wèn)題有沒(méi)有辦法?答案是肯定的,用過(guò)Gmail的知道,Gmail下面采用的ajax技術(shù)解決了這個(gè)問(wèn)題,在Gmail下面是可以后退的,但是,它也并不能改變ajax的機(jī)制,它只是采用的一個(gè)比較笨但是有效的辦法,即用戶(hù)單擊后退按鈕訪問(wèn)歷史記錄時(shí),通過(guò)創(chuàng)建或使用一個(gè)隱藏的IFRAME來(lái)重現(xiàn)頁(yè)面上的變更。(例如,當(dāng)用戶(hù)在Google Maps中單擊后退時(shí),它在一個(gè)隱藏的IFRAME中進(jìn)行搜索,然后將搜索結(jié)果反映到Ajax元素上,以便將應(yīng)用程序狀態(tài)恢復(fù)到當(dāng)時(shí)的狀態(tài)。)
但是,雖然說(shuō)這個(gè)問(wèn)題是可以解決的,但是它所帶來(lái)的開(kāi)發(fā)成本是非常高的,和ajax框架所要求的快速開(kāi)發(fā)是相背離的。這是ajax所帶來(lái)的一個(gè)非常嚴(yán)重的問(wèn)題。
2、安全問(wèn)題
技術(shù)同時(shí)也對(duì)IT企業(yè)帶來(lái)了新的安全威脅,ajax技術(shù)就如同對(duì)企業(yè)數(shù)據(jù)建立了一個(gè)直接通道。這使得開(kāi)發(fā)者在不經(jīng)意間會(huì)暴露比以前更多的數(shù)據(jù)和服務(wù)器邏輯。ajax的邏輯可以對(duì)客戶(hù)端的安全掃描技術(shù)隱藏起來(lái),允許黑客從遠(yuǎn)端服務(wù)器上建立新的攻擊。還有ajax也難以避免一些已知的安全弱點(diǎn),諸如跨站點(diǎn)腳步攻擊、SQL注入攻擊和基于credentials的安全漏洞等。
3、對(duì)搜索引擎的支持比較弱。
4、破壞了程序的異常機(jī)制。至少?gòu)哪壳翱磥?lái),像ajax.dll,ajaxpro.dll這些ajax框架是會(huì)破壞程序的異常機(jī)制的。關(guān)于這個(gè)問(wèn)題,我曾經(jīng)在開(kāi)發(fā)過(guò)程中遇到過(guò),但是查了一下網(wǎng)上幾乎沒(méi)有相關(guān)的介紹。后來(lái)我自己做了一次試驗(yàn),分別采用ajax和傳統(tǒng)的form提交的模式來(lái)刪除一條數(shù)據(jù)……給我們的調(diào)試帶來(lái)了很大的困難。
5、另外,像其他方面的一些問(wèn)題,比如說(shuō)違背了url和資源定位的初衷。例如,我給你一個(gè)url地址,如果采用了ajax技術(shù),也許你在該url地址下面看到的和我在這個(gè)url地址下看到的內(nèi)容是不同的。這個(gè)和資源定位的初衷是相背離的。
6、一些手持設(shè)備(如手機(jī)、PDA等)現(xiàn)在還不能很好的支持ajax,比如說(shuō)我們?cè)谑謾C(jī)的瀏覽器上打開(kāi)采用ajax技術(shù)的網(wǎng)站時(shí),它目前是不支持的,當(dāng)然,這個(gè)問(wèn)題和我們沒(méi)太多關(guān)系。
8、ajax的幾種框架
目前我們采用的比較多的ajax框架主要有ajax.dll,ajaxpro.dll,magicajax.dll 以及微軟的atlas框架。Ajax.dll和Ajaxpro.dll這兩個(gè)框架差別不大,而magicajax.dll只是封裝得更厲害一些,比如說(shuō)它可以直接返回DataSet數(shù)據(jù)集,前面我們已經(jīng)說(shuō)過(guò),ajax返回的都是字符串,magicajax只是對(duì)它進(jìn)行了封裝而已。但是它的這個(gè)特點(diǎn)可以給我們帶來(lái)很大的方便,比如說(shuō)我們的頁(yè)面有一個(gè)列表,而列表的數(shù)據(jù)是不斷變化的,那么我們可以采用magicajax來(lái)處理,操作很簡(jiǎn)單,添加magicajax之后,將要更新的列表控件放在magicajax的控件之內(nèi),然后在pageload里面定義更新間隔的時(shí)間就ok了,atlas的原理和magicajax差不多。但是,需要注意的一個(gè)問(wèn)題是,這幾種框架都只支持IE,沒(méi)有進(jìn)行瀏覽器兼容方面的處理,用反編譯工具察看他們的代碼就可以知道。
除了這幾種框架之外,我們平時(shí)用到的比較多的方式是自己創(chuàng)建xmlHttpRequest對(duì)象,這種方式和前面的幾種框架相比更具有靈活性。另外,在這里還提一下aspnet2.0自帶的異步回調(diào)接口,它和ajax一樣也可以實(shí)現(xiàn)局部的無(wú)刷新,但它的實(shí)現(xiàn)實(shí)際上也是基于xmlhttprequest對(duì)象的,另外也是只支持IE,當(dāng)然這是微軟的一個(gè)競(jìng)爭(zhēng)策略。
9.ajax應(yīng)用舉例
以上內(nèi)容是轉(zhuǎn)載高人寫(xiě)的資料,下面我將我在項(xiàng)目中實(shí)際應(yīng)用給出個(gè)例子,這個(gè)例子是這樣的:我參與的一個(gè)項(xiàng)目的值班安排模塊里,選擇值班人時(shí),彈出的是個(gè)聯(lián)系人樹(shù)型TreeView結(jié)構(gòu)圖,點(diǎn)開(kāi)哪個(gè)部門(mén),然后部門(mén)下的聯(lián)系人就展開(kāi)了,原先是這樣的,選擇好某些聯(lián)系人后,哪天白天或晚上的值班人就是這樣的格式”小A,小B”,但是現(xiàn)在要求這樣的格式”小A(部門(mén)一),小B(部門(mén)二)”這里假設(shè)小A屬于部門(mén)一,小B屬于部門(mén)二。由于選擇聯(lián)系人是純前臺(tái)javascript的操作的,這里要通過(guò)聯(lián)系人userlist表中的部門(mén)id,來(lái)取得部門(mén)的名稱(chēng),也就是通過(guò)前臺(tái)取后臺(tái)的數(shù)據(jù),這個(gè)在系列五里我也闡述過(guò),下面給出代碼:
var param= "date=%=stryear%>/%=strmonth%>/" + x %=stryear%>%=strmonth%>
+"Type=" + type
+"Other=" + eval_r("formData.RBOTHER"+x+".value")
+"ZBRY=" + eval_r("formData.RBZBRY"+x+".value")
+"ZBRYID=" + eval_r("formData.RBZBRYID"+x+".value")
+"Demo=" + eval_r("formData.RBDEMO"+x+".value")
+"id=" + eval_r("formData.RBZBID"+x+".value");//傳遞的參數(shù)
var retVal = window.showModalDialog( "chooseUsers.asp?"+param,this, "dialogWidth=280px; dialogHeight=500px; help=no; status=no; scroll=no; resizable=yes; ");
//彈出對(duì)話框取得聯(lián)系人
//ajax調(diào)用服務(wù)器端方法取到部門(mén)名稱(chēng)
if(retVal ['userIds']!="" retVal ['userIds']!=null)//聯(lián)系人id集合格式1,2,3,4
{
var PostUrl=" ../../../Application/CallBoard/GetDepartMentByUid.aspx?userIDs="+objRetVal['userIds']+"";//后臺(tái)處理頁(yè)面url
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");//新建一個(gè)xmlhttprequest對(duì)象
xmlHttp.open("POST", PostUrl, false);
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlHttp.send("");
var builder= xmlHttp.responseText; //將值傳遞回來(lái),拼成了新格式
eval_r("formData.RBZBRY"+x+".value = '" +builder+"'");// formData.RBZBRY為一文本控件,將顯示值班人員新格式
}
}
以上所述是小編給大家介紹的Ajax的原理及優(yōu)缺點(diǎn),希望對(duì)大家有所幫助!
您可能感興趣的文章:- ajax原理總結(jié)附簡(jiǎn)單實(shí)例及其優(yōu)點(diǎn)
- JQuery的Ajax跨域請(qǐng)求原理概述及實(shí)例
- 利用iframe實(shí)現(xiàn)ajax跨域通信的實(shí)現(xiàn)原理(圖解)
- Ajax二級(jí)聯(lián)動(dòng)菜單實(shí)現(xiàn)原理及代碼
- js/ajax跨越訪問(wèn)-jsonp的原理和實(shí)例(javascript和jquery實(shí)現(xiàn)代碼)
- Ajax通訊原理XMLHttpRequest
- jQuery的實(shí)現(xiàn)原理的模擬代碼 -5 Ajax
- Ajax的內(nèi)部實(shí)現(xiàn)機(jī)制、原理與實(shí)踐小結(jié)
- AJAX工作原理及優(yōu)缺點(diǎn)詳解