AJAX工作原理

WBOY
發布: 2016-07-29 09:15:04
原創
1445 人瀏覽過

一、ajax技術的背景一、

ajax技術的背景不可否認,ajax技術的流行得益於對設計的廣泛應用,催生了ajax的流行。而這也讓微軟感到無比的尷尬,因為早在97年,微軟便已經發明了ajax中的關鍵技術,並且在99年IE5推出之時,它便開始支持XmlHttpRequest對象,並且微軟之前已經開始在它的一些產品中應用ajax,比如說MSDN網站選單中的一些應用。遺憾的是,不知道是什麼想法,當時微軟發明了ajax的核心技術之後,並沒有看到它的潛力而加以發展和推廣,而是將它擱置起來。對這一點來說,我個人是覺得非常奇怪的,因為以微軟的資源和它的戰略眼光來說,應該不會看不到ajax技術的前景,唯一的解釋也許就是因為當時它的主要競爭對手Netscape的消失反而使它變得麻痺和遲鈍,畢竟巨人也有打盹的時候,例如IBM曾經在對微軟戰略上的失誤。正是這次的失誤,成就了它現在的競爭對手google在ajax方面的領先地位,而事實上google目前在ajax技術方面的領先是微軟所無法達到的,這一點在後面我講述ajax缺陷的時候也會提到。現在微軟也意識到了這個問題,因此它也開始在ajax領域奮起直追,比如說推出它自己的ajax框架atlas,並且在.NET2.0也提供了一個用來實現異步回調的接口,即ICallBack介面。那麼微軟為什麼對自己在ajax方面的落後如此緊張呢?現在就讓我們來分析一下ajax

技術後面隱藏的深刻意義。

二、什麼是

ajax

ajax即「Asynchronous Javascript AND XMLXML」(JavaScript和XVML),是一種建立技術互動式應用程式的設計技術。ajax包含使用XHTML和CSS標準實作Web頁面,使用DOM實作動態顯示和互動,使用XML進行資料交換和處理,最後使用javaScript綁定和處理所有資料。ajax將一些伺服器負擔的工作下放至客戶端,利用客戶端的某些能力來處理數據,減少用戶實際和心理上的等待時間,用戶不在遇到因為頁面刷新導致瀏覽器長時間空白,甚至停止回應的糟糕結果,這給了使用者最佳的體驗效果。ajax基於標準化的XML,被廣泛使用並且支持,利於維護和修改。ajax呼叫外部資料很方便,在需要頁面與資料分離的情況下,可以套用
ajax
取得資料。

三、ajax

所包含的技術

所包含的技術



。它是由下列技術組合而成。
1.使用CSS和XHTML來表示。2. 使用DOM模型來互動和動態顯示。3.使用XMLHttpRequest來和伺服器進行非同步通訊。
4.使用java
S

cript來綁定和呼叫。

四、ajax

原理與XmlHttpRequest

對象請求,從伺服器獲得數據,然後用javascript來操作DOM而更新頁面。這其中最關鍵的一步就是從伺服器取得請求資料。要清楚這個過程和原理,我們必須對 XMLHttpRequest有所了解。 XMLHttpRequest是ajax的核心機制,它是在IE5中首先引入的,是一種支援非同步請求的技術。簡單的說,也就是javascript可以及時向伺服器提出請求和處理回應,而不阻塞使用者。達到無刷新的效果。透過下圖能更清楚的理解ajax的工作原理
ajax

工作原理"><strong></strong><p><span>XMLHttpRequest的工作原理。 <br>XMLHttpRequest<strong>物件</strong>的屬性有:<br>onreadystatechange  每次狀態改變所觸發事件的事件處理程序。 <br>responseText     從伺服器程序傳回資料的字串形式。 <br>responseXML    從伺服器程序傳回的DOM相容的文件資料<strong>物件</strong>。 <br>status           從伺服器回傳的數字代碼,例如常見的404(未找到)和200(已就緒)<br>statusText       伴隨狀態碼的字串資訊<br>readyState         伴隨狀態碼的字串資訊<strong>readyState  ,但是尚未初始化(尚未調用open方法)</strong><br><strong></strong>1 (初始化) </span>物件</p>已建立,尚未調用send方法<p><span><strong></strong>2 (發送資料) send方法已調用,但是當前的狀態及http </span></p><p><span>3 (數據傳送中) 已接收部分數據,因為響應及http頭不全,這時透過responseBody和responseText獲取部分數據會出現錯誤</span></p><p><span>4 (完成) 數據接收完畢,此時可以透過透過responseXml和responseText取得完整的回應資料</span></p><p><span>由於各瀏覽器之間存在差異,所以建立一個</span></p>XMLHttpRequest<p><span></span>物件<span lang=可能需要不同的方法。這個差異主要體現在IE和其它瀏覽器之間。以下是比較標準的建立XMLHttpRequest物件的方法

登入後複製
xmlHttp.send(url);xmlHttp.send(null); } //回调函数 处理服务器响应 function updatePage() { //判断xmlHttpRequset() 对象的readyState值是否等于4 if(xmlHttp.readyState == 4 && xmlHttp.status ==200) { //获取服务器返回的响应数据 var response = xmlHttp.responseText; document.getElementById('city').innerHTML = response; } }

  <strong>ajax</strong>简单应用  

请选择一个省(自治区)

登入後複製
登入後複製
),即資料已發送完畢。然後根據伺服器的設定詢問請求狀態,如果一切已經就緒(status=200),那麼就執行下面需要的操作。
對於XmlHttpRequest的兩個方法,open和send,其中open方法指定了:
a、向伺服器提交資料的類型,即post還是get。
b、請求的url位址和傳遞的參數。
c、傳輸方式,false為同步,true為非同步。預設為true。如果是非同步通訊方式(true),客戶機就不等待伺服器的回應;如果是同步方式(false),客戶機就要等到伺服器回傳訊息後才去執行其他操作。我們需要根據實際需求來指定同步方式,在某些頁面中,可能會發出多個請求,甚至是有組織有計劃有隊形大規模的高強度的request,而後一個是會覆蓋前一個的,這個時候當然要指定同步方式。d、Send方法用來發送請求

從XMLHttpRequest的工作流程,我們可以看出,XMLHttpRequest是完全用來向伺服器發出一個請求的,它的作用也局限於此,但它的作用是整個ajaxajax,因為ajax無非是兩個過程,發出請求和回應請求。並且它完全是一種客戶端的技術。而XMLHttpRequest正是處理了伺服器端和客戶端通訊的問題所以才會如此的重要。

我們可以把伺服器端看成一個資料接口,它返回的是一個純文字流,當然,這個文字流可以是XML格式,可以是Html,可以是Javascript程式碼,也可以只是一個字串。這時候,XMLHttpRequest向伺服器端請求這個頁面,伺服器端將文字的結果寫入頁面,這和普通的web開發流程是一樣的,不同的是,客戶端在非同步取得這個結果後,不是直接顯示在頁面,而是先由javascript來處理,然後再顯示在頁面。至於現在流行的很多ajax控件,比如magicajax等,可以返回DataSet等其它數據類型,只是將這個過程封裝了的結果,本質上他們並沒有什麼太大的區別。

五、ajax的優缺點

體驗非常好。

2、使用非同步方式與伺服器通信,不需要打斷使用者的操作,具有更迅速的回應能力。

3、可以把以前一些伺服器負擔的工作轉嫁到客戶端,利用客戶端閒置的能力來處理,減輕服務器和頻寬的負擔,節約空間和寬帶租用成本。並且減輕伺服器的負擔,ajax的原則是“按需取資料”,可以最大程度的減少冗餘請求,和回應對伺服器造成的負擔

4、基於標準化的並被廣泛支援的技術,不需要下載插件或小程式。

ajax的缺點:
因為平時我們大多注意的都是ajax給我們所帶來的好處諸如用戶體驗的提升。而對ajax所帶來的缺陷則有所忽視。以下所闡述的ajax的缺陷都是它先天產生的。

1、ajax幹掉了back按鈕,即對瀏覽器後退機制的破壞。後退按鈕是一個標準的web站點的重要功能,但是它沒辦法和js進行很好的合作。這是ajax所帶來的一個比較嚴重的問題,因為使用者往往是希望能夠透過後退來取消前一次的操作。那麼對於這個問題有沒有辦法呢?答案是肯定的,用過Gmail的知道,Gmail下面採用的ajax技術解決了這個問題,在Gmail下面是可以後退的,但是,它也並不能改變ajax的機制,它只是採用的一個比較笨但是有效的辦法,即使用者點擊後退按鈕存取歷史記錄時,透過建立或使用一個隱藏的IFRAME來重現頁面上的變更。 (例如,當用戶在Google Maps中單擊後退時,它在一個隱藏的IFRAME中進行搜索,然後將搜索結果反映到ajax元素上,以便將應用程式狀態恢復到當時的狀態。 )但是,雖然說這個問題是可以解決的,但是它所帶來的開發成本是非常高的,和ajax框架所要求的快速開發是相背離的。這是ajax所帶來的一個非常嚴重的問題。

2、安全問題
技術同時也對IT企業帶來了新的安全威脅,ajax技術就如同對企業資料建立了一個直接通道。這使得開發者在不經意間會暴露比以前更多的資料和伺服器邏輯。ajax的邏輯可以對客戶端的安全掃描技術隱藏起來,讓駭客可以從遠端伺服器建立新的攻擊。還有ajax也難以避免一些已知的安全弱點,諸如跨站點腳步攻擊、SQL注入攻擊和基於credentials的安全漏洞等。
3、對搜索索引擎的支援比較弱。
4、破壞了程式的異常機制。至少從目前看來,像ajax.dll,ajaxpro.dll這些ajax框架是會破壞程式的異常機制的。關於這個問題,我曾經在開發過程中遇到過,但是查了一下網路上幾乎沒有相關的介紹。後來我自己做了一次試驗,分別採用ajax和傳統的form提交的模式來刪除一條數據……給我們的調試帶來了很大的困難。
5、另外,像其他方面的一些問題,比如說違背了url和資源定位的初衷。例如,我給你一個url地址,如果採用了ajax技術,也許你在該url地址下面看到的和我在這個url地址下看到的內容是不同的。這個和資源定位的初衷是相背離的。
6、一些手持設備(如手機、PDA等)現在還不能很好的支援ajax,比如說我們在手機的瀏覽器上打開採用ajax技術的網站時,它目前是不支持的,當然,這個問題跟我們沒太多關係。

六、ajax的幾個框架

目前我们采用的比较多的ajax框架主要有ajax.dll,ajaxpro.dll,magicajax.dll 以及微软的atlas框架。ajax.dll和ajaxpro.dll这两个框架差别不大,而magicajax.dll只是封装得更厉害一些,比如说它可以直接返回DataSet数据集,前面我们已经说过,ajax返回的都是字符串,magicajax只是对它进行了封装而已。但是它的这个特点可以给我们带来很大的方便,比如说我们的页面有一个列表,而列表的数据是不断变化的,那么我们可以采用magicajax来处理,操作很简单,添加magicajax之后,将要更新的列表控件放在magicajax的控件之内,然后在pageload里面定义更新间隔的时间就ok了,atlas的原理和magicajax差不多。但是,需要注意的一个问题是,这几种框架都只支持IE,没有进行浏览器兼容方面的处理,用反编译工具察看他们的代码就可以知道。
除了这几种框架之外,我们平时用到的比较多的方式是自己创建xmlHttpRequest对象,这种方式和前面的几种框架相比更具有灵活性。另外,在这里还提一下aspnet2.0自带的异步回调接口,它和ajax一样也可以实现局部的无刷新,但它的实现实际上也是基于xmlhttprequest对象的,另外也是只支持IE,当然这是微软的一个竞争策略。

七、ajax简单示例

示例实现的功能是当用户在WEB页面的下拉列表框中选择某个省的名称时,会在页面上显示该省的省会名称,而此时页面并不刷新。省会名称将由服务端传送至浏览器。这个示例包含三个部分(这里的服务端是PHP程序)

1、HTML页面,包含下拉列表框和要显示省会名称的位置

2、JavaScript程序,实现发送请求和处理响应。

3、服务端的PHP程序,用来接受浏览器的请求,向浏览器传送结果数据。

(客户端)HTML页面:

  <strong>ajax</strong>简单应用  

请选择一个省(自治区)

登入後複製
登入後複製
(服务端)PHP程序

'合肥', 'fj'=>'福州', 'gs'=>'兰州', 'gx'=>'南宁', 'gd'=>'广州', 'gz'=>'贵阳', 'hn'=>'海口', 'hb'=>'石家庄', 'hh'=>'郑州', 'hlg'=>'哈尔滨', ); if (empty($_GET['prov'])) { echo iconv("UTF-8", "UTF-8", '您还没有选择省(自治区)'); //注意:你的PHP文件使用的是GB2312编码保存的话,那iconv('GB2312','UTF-8','您还没有选择省(自治区)'); } else { $prov = $_GET['prov']; $city = $city_arr[$prov]; echo iconv("UTF-8", "UTF-8", '所选省(自治区)省会(首府)为:'.$city); //注意:你的PHP文件使用的是GB2312编码保存的话,那iconv('GB2312','UTF-8','所选省(自治区)省会(首府)为:'.$city);  } ?>
登入後複製
运行效果

AJAX工作原理


以上就介绍了AJAX工作原理,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn