什麼是AJAX(WEB)

什麼是ajax技術

Ajax用來描述一組技術,它使瀏覽器可以為用戶提供更為自然的瀏覽體驗。在Ajax之前,Web站點強制用戶進入提交/等待/重新顯示範例,用戶的動作總是與服務器的“思考時間”同步。Ajax提供與服務器異步通信的能力,從而使用戶從請求/響應的循環中解脫出來。藉助於Ajax,可以在用戶單擊按鈕時,使用JavaScript和DHTML立即更新UI,並向服務器發出異步請求,以執行更新或查詢數據庫。當請求返回時,就可以使用JavaScript和CSS來相應地更新UI,而不是刷新整個頁面。最重要的是,用戶甚至不知道瀏覽器正在與服務器通信:Web站點看起來是即時響應的。

定義Ajax

Adaptive Path公司的Jesse James Garrett這樣定義Ajax:

Ajax不是一種技術。實際上,它由幾種蓬勃發展的技術以新的強大方式組合而成。

主要包含的技術

基web標準(standards-based presentation)XHTML+CSS的表示;

使用 DOM(Document Object Model)進行動態顯示及交互;

使用 XML 和 XSLT 進行數據交換及相關操作;

使用 XMLHttpRequest 進行異步數據查詢、檢索;

使用 JavaScript 將所有的東西綁定在一起。英文參見Ajax的提出者Jesse James Garrett的原文,原文題目(Ajax: A New Approach to Web Applications)。

類似於DHTML或LAMP,AJAX不是指一種單一的技術,而是有機地利用了一系列相關的技術。事實上,一些基於AJAX的“派生/合成”式(derivative/composite)的技術正在出現,如“AFLAX”。

AJAX的應用使用支持以上技術的web瀏覽器作為運行平臺。這些瀏覽器目前包括:

Google Chrome、Mozilla、Firefox、Internet Explorer、Opera、Konqueror及Safari。但是Opera不支持XSL格式對象,也不支持XSLT。

在上面幾中技術中,除了XmlHttpRequest對象以外,其它所有的技術都是基於web標準並且已經得到了廣泛使用的,XMLHttpRequest雖然目前還沒有被W3C所採納,但是它已經是一個事實的標準,因為目前幾乎所有的主流瀏覽器都支持它。

ajax原理和XmlHttpRequest對象

Ajax的核心是JavaScript對象XmlHttpRequest。該對象在Internet Explorer 5中首次引入,它是一種支持異步請求的技術。簡而言之,XmlHttpRequest使您可以使用JavaScript向服務器提出請求並處理響應,而不阻塞用戶。

Ajax的原理簡單來說通過XmlHttpRequest對象來向服務器發異步請求,從服務器獲得數據,然後用javascript來操作DOM而更新頁面。這其中最關鍵的一步就是從服務器獲得請求數據。要清楚這個過程和原理,我們必須對 XMLHttpRequest有所瞭解。

XMLHttpRequest是ajax的核心機制,它是在IE5中首先引入的,是一種支持異步請求的技術。簡單的說,也就是javascript可以及時向服務器提出請求和處理響應,而不阻塞用戶。達到無刷新的效果。

所以我們先從XMLHttpRequest講起,來看看它的工作原理。

首先,我們先來看看XMLHttpRequest這個對象的屬性。

它的屬性有:

onreadystatechange 每次狀態改變所觸發事件的事件處理程序。

responseText 從服務器進程返回數據的字符串形式。

responseXML 從服務器進程返回的DOM兼容的文檔數據對象。

status 從服務器返回的數字代碼,比如常見的404(未找到)和200(已就緒)

status Text 伴隨狀態碼的字符串信息

readyState 對象狀態值

0 (未初始化) 對象已建立,但是尚未初始化(尚未調用open方法)

1 (初始化) 對象已建立,尚未調用send方法

2 (發送數據) send方法已調用,但是當前的狀態及http頭未知

3 (數據傳送中) 已接收部分數據,因為響應及http頭不全,這時通過responseBody和responseText獲取部分數據會出現錯誤,

4 (完成) 數據接收完畢,此時可以通過通過responseXml和responseText獲取完整的回應數據。

ajax的優點

Ajax的給我們帶來的好處大家基本上都深有體會,在這裡我只簡單的講幾點:

1、最大的一點是頁面無刷新,在頁面內與服務器通信,給用戶的體驗非常好。

  2、使用異步方式與服務器通信,不需要打斷用戶的操作,具有更加迅速的響應能力。

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

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

ajax的缺點

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.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,當然這是微軟的一個競爭策略。

function cretateXMLHttpRequest()

{

if(window.XMLHttpRequest)

{

xmlhttp=new XMLHttpRequest();

}

else if(window.ActiveXObject)

{

xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

}

}

function doStart(pages)//提交數據參數比如傳頁面參數

{

page=pages;

cretateXMLHttpRequest();

var url="page.aspx?page="+pages;

xmlhttp.open("GET",url,false);

xmlhttp.send();

return xmlhttp.responseText;

}var str=doStart(pages);--返回字符串就是把你要的數據在另一個頁面讀取出來在回傳到你使用的頁面,比如 你在入庫的時候要知道到你輸入的數量是否大於出庫數量,就在你輸入後通過AJAX 在另個頁面把輸入的數量和庫存數量作比較再把比較後的結果返回到你使用的頁面

ajax示例

驗證用戶名是否註冊。


分享到:


相關文章: