茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1669450 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_60D_00061.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

網頁設計 : [轉貼]Ajax簡介

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]Ajax簡介
Ajax簡介

  作為J2EE開發人員,我們似乎經常關注「後端機制(backend mechanics)」。我們通常會忘記,J2EE的主要成功之處在Web應用程序方面;許多原因使得人們喜歡利用Web開發應用程序,但主要還是因為其 易於部署的特點允許站點以儘可能低的成本擁有上百萬的用戶。遺憾的是,在過去幾年中,我們在後端投入了太多的時間,而在使我們的Web用戶界面對用戶自然 和響應靈敏方面卻投入不足。

  本文介紹一種方法,Ajax,使用它可以構建更為動態和響應更靈敏的Web應用程序。該方法的關鍵在於對瀏覽器端的JavaScript、 DHTML和與服務器異步通信的組合。本文也演示了啟用這種方法是多麼簡單:利用一個Ajax框架(指DWR)構造一個應用程序,它直接從瀏覽器與後端服 務進行通信。如果使用得當,這種強大的力量可以使應用程序更加自然和響應靈敏,從而提升用戶的瀏覽體驗。

  該應用程序中所使用的示例代碼已打包為單獨的WAR文件,可供下載。

簡介


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

  雖然Ajax所需的基礎架構已經出現了一段時間,但直到最近異步請求的真正威力才得到利用。能夠擁有一個響應極其靈敏的Web站點確實激動人 心,因為它最終允許開發人員和設計人員使用標準的HTML/CSS/JavaScript堆棧創建「桌面風格的(desktop-like)」可用性。

  通常,在J2EE中,開發人員過於關注服務和持久性層的開發,以至於用戶界面的可用性已經落後。在一個典型的J2EE開發週期中,常常會聽到這樣的話,「我們沒有可投入UI的時間」或「不能用HTML實現」。但是,以下Web站點證明,這些理由再也站不住腳了:

  所有這些Web站點都告訴我們,Web應用程序不必完全依賴於從服務器重新載入頁面來向用戶呈現更改。一切似乎就在瞬間發生。簡而言之,在涉及到用戶界面的響應靈敏度時,基準設得更高了。

定義Ajax

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

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

  • 基於 XHTMLCSS 標準的表示;
  • 使用
    Document Object Model 進行動態顯示和交互;
  • 使用XMLHttpRequest與服務器進行異步通信;
  • 使用JavaScript綁定一切。

  這非常好,但為什麼要以Ajax命名呢?其實術語Ajax是由Jesse James Garrett創造的,他說它是「Asynchronous JavaScript + XML的簡寫」。

Ajax的工作原理

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

  在創建Web站點時,在客戶端執行屏幕更新為用戶提供了很大的靈活性。下面是使用Ajax可以完成的功能:

  • 動態更新購物車的物品總數,無需用戶單擊Update並等待服務器重新發送整個頁面。
  • 提升站點的性
    能,這是通過減少從服務器下載的數據量而實現的。例如,在Amazon的購物車頁面,當更新籃子中的一項物品的數量時,會重新載入整個頁面,這必須下載32K的數據。如果使用Ajax計算新的總量,服務器只會返回新的總量值,因此所需的帶寬僅為原來的百分之一。
  • 消除了每次用戶輸入時的頁面刷新。例如,在Ajax中,如果用戶在分頁列表上單擊Next,則服務器數據只刷新列表而不是整個頁面。
  • 直接編輯表格數據,而不是要求用戶導航到新的頁面來編輯數據。對於Ajax,當用戶單擊Edit時,可以將靜態表格刷新為內容可編輯的表格。用戶單擊Done之後,就可以發出一個Ajax請求來更新服務器,並刷新表格,使其包含靜態、只讀的數據。

  一切皆有可能!但願它能夠激發您開始開發自己的基於Ajax的站點。然而,在開始之前,讓我們介紹一個現有的Web站點,它遵循傳統的提交/等待/重新顯示的範例,我們還將討論Ajax如何提升用戶體驗。

Ajax可用於那些場景?——一個例子:MSN Money頁面

  前幾天,在瀏覽MSN Money頁面的時候,有一篇 關於房地產投資的文章
引起了我的好奇心。我決定使用站點的「Rate this article」(評價本文)功能,鼓勵其他的用戶花一點時間來閱讀這篇文章。在我單擊vote按鈕並等待了一會兒之後,整個頁面被刷新,在原來投票問題所在的地方出現了一個漂亮的感謝畫面。

  而Ajax能夠使用戶的體驗更加愉快,它可以提供響應更加靈敏的UI,並消除頁面刷新所帶來的閃爍。目前,由於要刷新整個頁面,需要傳送大量的 數據,因為必須重新發送整個頁面。如果使用Ajax,服務器可以返回一個包含了感謝信息的500字節的消息,而不是發送26,813字節的消息來刷新整個 頁面。即使使用的是高速Internet,傳送26K和1/2K的差別也非常大。同樣重要的是,只需要刷新與投票相關的一小節,而不是刷新整個屏幕。

  讓我們利用Ajax實現自己的基本投票系統。

原始的Ajax:直接使用XmlHttpRequest

  如上所述,Ajax的核心是JavaScript對象XmlHttpRequest。下面的示例文章評價系統將帶您熟悉Ajax的底層基本知識:
http://tearesolutions.com/ajax-demo/raw-ajax.html 。註:如果您已經在本地WebLogic容器中安裝了 ajax-demo.war ,可以導航到 http://localhost:7001/ajax-demo/raw-ajax.html

  瀏覽應用程序,參與投票,並親眼看它如何運轉。熟悉了該應用程序之後,繼續閱讀,進一步了解其工作原理細節。

  首先,您擁有一些簡單的定位點標記,它連接到一個JavaScriptcastVote(rank)函數。
function castVote(rank) {
var url = "/ajax-demo/static-article-ranking.html";
var callback = processAjaxResponse;
executeXhr(callback, url);
}

  該函數為您想要與之通信的服務器資源創建一個URL並調用內部函數executeXhr,提供一個回調JavaScript函數,一旦服務器響 應可用,該函數就被執行。由於我希望它運行在一個簡單的Apache環境中,「cast vote URL」只是一個簡單的HTML頁面。在實際情況中,被調用的URL將記錄票數並動態地呈現包含投票總數的響應。

  下一步是發出一個XmlHttpRequest請求:
function executeXhr(callback, url) {
// branch for native XMLHttpRequest object
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
req.onreadystatechange = callback;
req.open("GET", url, true);
req.send(null);
} // branch for IE/Windows ActiveX version
else if (window.ActiveXObject) {
req = new ActiveXObject("Microsoft.XMLHTTP");
if (req) {
req.onreadystatechange = callback;
req.open("GET", url, true);
req.send();
}
}
}

  如您所見,執行一個XmlHttpRequest並不簡單,但非常直觀。和平常一樣,在JavaScript領域,大部分的工作量都花在確保瀏 覽器兼容方面。在這種情況下,首先要確定XmlHttpRequest是否可用。如果不能用,很可能要使用Internet Explorer,這樣就要使用所提供的ActiveX實現。

executeXhr()方法中最關鍵的部分是這兩行:


req.onreadystatechange = callback;
req.open("GET", url, true);

  第一行定義了JavaScript回調函數,您希望一旦響應就緒它就自動執行,而req.open()方法中所指定的「true」標誌說明您想要異步執行該請求。

  一旦服務器處理完XmlHttpRequest並返回給瀏覽器,使用req.onreadystatechange指派所設置的回調方法將被自動調用。
function processAjaxResponse() {
// only if req shows "loaded"
if (req.readyState == 4) {
// only if "OK"
if (req.status == 200) {
502 502'votes').innerHTML = req.responseText;
} else {
alert("There was a problem retrieving the XML data:
" +
req.statusText);
}
}
}

  該代碼相當簡潔,並且使用了幾個幻數,這使得難以一下子看出發生了什麼。為了弄清楚這一點,下面的表格(引用自 http://developer.apple.com/internet/webcontent/xmlhttpreq.html )列舉了常用的XmlHttpRequest對象屬性。

屬性

描述

onreadystatechange

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

readyState

對象狀態值:

  • 0 = 未初始化(uninitialized)
  • 1 = 正在加載(loading)
  • 2 = 加載完畢(loaded)
  • 3 = 交互(interactive)
  • 4 = 完成(complete)


responseText

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

responseXML

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

status

從服務器返回的數字代碼,比如404(未找到)或200(就緒)

statusText

伴隨狀態碼的字符串信息

  現在processVoteResponse()函數開始顯示出其意義了。它首先檢查XmlHttpRequest的整體狀態以保證它已經完成 (readyStatus == 4),然後根據服務器的設定詢問請求狀態。如果一切正常(status == 200),就使用innerHTML屬性重寫DOM的「votes」節點的內容。

  既然您親眼看到了XmlHttpRequest對像是如何工作的,就讓我們利用一個旨在簡化JavaScript與Java應用程序之間的異步通信的框架來對具體的細節進行抽象。

Ajax: DWR方式


  按照與文章評價系統相同的流程,我們將使用Direct Web Remoting(DWR)框架實現同樣的功能。

  假定文章和投票結果存儲在一個數據庫中,使用某種對象/關係映射技術來完成抽取工作。為了部署起來儘可能地簡單,我們不會使用數據庫進行持久性 存儲。此外,為使應用程序儘可能通用,也不使用Web框架。相反,應用程序將從一個靜態HTML文件開始,可以認為它由服務器動態地呈現。除了這些簡化措 施,應用程序還應該使用Spring Framework關聯一切,以便輕鬆看出如何在一個「真實的」應用程序中使用DWR。

  現在應該下載示例應用程序並熟悉它。該應用程序被壓縮為標準的WAR文件,因此您可以把它放置到任何一個Web容器中——無需進行配置。部署完畢之後,就可以導航到 http://localhost:7001/ajax_demo/dwr-ajax.html 來運行程序。

  可以查看 HTML 源代碼
,了解它如何工作。給人印象最深的是,代碼如此簡單——所有與服務器的交互都隱藏在JavaScript對象ajaxSampleSvc的後面。更加令人驚訝的是,ajaxSampleSvc服務不是由手工編寫而是完全自動生成的!讓我們繼續,看看這是如何做到的。

引入DWR

  如同在「原始的Ajax」一節所演示的那樣,直接使用XmlHttpRequest創建異步請求非常麻煩。不僅JavaScript代碼冗長,而且必須考慮服務器端為定位Ajax請求到適當的服務所需做的工作,並將結果封送到瀏覽器。

  設計DWR的目的是要處理將Web頁面安裝到後端服務上所需的所有信息管道。它是一個Java框架,可以很輕鬆地將它插入到Web應用程序中, 以便JavaScript代碼可以調用服務器上的服務。它甚至直接與Spring Framework集成,從而允許用戶直接向Web客戶機公開bean。

  DWR真正的巧妙之處是,在用戶配置了要向客戶機公開的服務之後,它使用反射來生成JavaScript對象,以便Web頁面能夠使用這些對象 來訪問該服務。然後Web頁面只需接合到生成的JavaScript對象,就像它們是直接使用服務一樣;DWR無縫地處理所有有關Ajax和請求定位的瑣 碎細節。

  讓我們仔細分析一下示例代碼,弄清它是如何工作的。


應用程序細節:DWR分析

  關於應用程序,首先要注意的是,它是一個標準的Java應用程序,使用分層架構(Layered Architecture)設計模式。使用DWR通過JavaScript公開一些服務並不影響您的設計。

  下面是一個簡單的Java服務,我們將使用DWR框架直接將其向JavaScript代碼公開:


package com.tearesolutions.service;
public interface AjaxSampleSvc {
Article castVote(int rank);
}

  這是一個被簡化到幾乎不可能的程度的例子,其中只有一篇文章可以投票。該服務由Spring管理,它使用的bean名是ajaxSampleSvc,它的持久性需求則依賴於ArticleDao。詳情請參見applicationContext.xml。

  為了把該服務公開為JavaScript對象,需要配置DWR,添加dwr.xml文件到WEB-INF目錄下:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 0.4//EN"
"http://www.getahead.ltd.uk/dwr/dwr.dtd">

<dwr>
<allow>
<create creator="spring" javascript="ajaxSampleSvc">
<param name="beanName" value="ajaxSampleSvc" />
</create>
<convert converter="bean" match="com.tearesolutions.model.Article"/>
<exclude method="toString"/>
<exclude method="setArticleDao"/>
</allow>
</dwr>

  dwr.xml文件告訴DWR哪些服務是要直接向JavaScript代碼公開的。注意,已經要求公開Spring bean ajaxSampleSvc。DWR將自動找到由應用程序設置的SpringApplicationContext。為此,必須使用標準的servlet 過濾器ContextLoaderListener來初始化Spring ApplicationContext。

  DWR被設置為一個servlet,所以把它的定義添加到web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD
Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>Ajax Examples</display-name>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>ajax_sample</servlet-name>
<servlet-class>com.tearesolutions.web.AjaxSampleServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<display-name>DWR Servlet</display-name>
<description>Direct Web Remoter Servlet</description>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ajax_sample</servlet-name>
<url-pattern>/ajax_sample</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
</web-app>

  做完這些之後,可以加載 http://localhost:7001/ajax-demo/dwr ,看看哪些服務可用。結果如下:

圖3. 可用的服務

  單擊ajaxSampleSvc鏈接,查看有關如何在HTML頁面內直接使用服務的示例實現。其中包含的兩個JavaScript文件完成了大部分的功能:
<script type='text/javascript'
src='/ajax-demo/dwr/interface/ajaxSampleSvc.js'></script>
<script type='text/javascript'
src='/ajax-demo/dwr/engine.js'></script>

ajaxSampleSvc.js是動態生成的:


function ajaxSampleSvc() { }
ajaxSampleSvc.castVote = function(callback, p0)
{
DWREngine._execute(callback, '/ajax-demo/dwr',
'ajaxSampleSvc', 'castVote', p0);
}

  現在可以使用JavaScript對象ajaxSampleSvc替換所有的XmlHttpRequest代碼,從而重構raw-ajax.html文件。可以在dwr-ajax.html文件中看到改動的結果;下面是新的JavaScript函數:


function castVote(rank) {
ajaxSampleSvc.castVote(processResponse, rank);
}
function processResponse(data) {
var voteText = "<p><strong>Thanks for Voting!</strong></p>"
+ "<p>Current ranking: " + data.voteAverage
+ " out of 5</p>"
+ "<p>Number of votes placed: "
+ data.numberOfVotes + "</p>";
502 502'votes').innerHTML = voteText;
}

  驚人地簡單,不是嗎?由ajaxSampleSvc對象返回的Article域對象序列化為一個JavaScript對象,允許在它上面調用諸 如numberOfVotes()和voteAverage()之類的方法。在動態生成並插入到DIV元素「votes」中的HTML代碼內使用這些數 據。

下一步工作

   在後續文章中,我將繼續有關Ajax的話題,涉及下面這些方面:

  • Ajax最佳實踐

  像許多技術一樣,Ajax是一把雙刃劍。對於一些用例,其應用程序其實沒有必要使用Ajax,使用了反而有損可用性。我將介紹一些不適合使用的模式,突出說明Ajax的一些消極方面,並展示一些有助於緩和這些消極方面的機制。例如,對 Netflix電影瀏覽器 來說,Ajax是合適的解決方案嗎?或者,如何提示用戶確實出了一些問題,而再次單擊按鈕也無濟於事?

  • 管理跨請求的狀態

  在使用Ajax時,最初的文檔DOM會發生一些變化,並且有大量的頁面狀態信息存儲在客戶端變量中。當用戶跟蹤一個鏈接到應用程序中的另一個頁面時,狀態就丟失了。當用戶按照慣例單擊Back按鈕時,呈現給他們的是緩存中的初始頁面。這會使用戶感到非常迷惑!


  • 調試技巧

  使用JavaScript在客戶端執行更多的工作時,如果事情不按預期方式進行,就需要一些調試工具來幫助弄清出現了什麼問題。

結束語

  本文介紹了Ajax方法,並展示了如何使用它來創建一個動態且響應靈敏的Web應用程序。通過使用DWR框架,可以輕鬆地把Ajax融合到站點中,而無需擔心所有必須執行的實際管道工作。

  特別感謝Getahead IT諮詢公司的Joe Walker和他的團隊開發出DWR這樣神奇的工具。感謝你們與世界共享它!

下載

  本文中演示的應用程序源代碼可供下載: ajax-demo.war (1.52 MB)。

參考資料

原文出處

An Introduction To Ajax

http://dev2dev.bea.com/pub/a/2005/08/ajax_introduction.html

冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]AJAX的七宗罪
AJAX的七宗罪

引子

2005.2.18,Jesse James Garrett 的一篇A New Approach to Web Applications引出了AJAX這個web界的新名詞。加上新寵兒在降生下來就和足球名隊阿賈克斯、Google Suggest Google Maps這些大腕息息相關,不想出名都難啊。但似乎人們給與AJAX的期望有點太高了,甚至有人提出了用AJAX取代Java Applet和Flash。不知Flickr是不是也聽到這種呼聲才把自己的Flash UI轉向了普通的Javascript。AJAX是個偉大的東西,它是在不創造新技術的前提下誕生的一個標準,憑這一點就能招來大批的狂熱追隨者, AJAX看起來更像是楊過和小龍女練得玉女素心劍一樣,分開來沒有什麼破壞力,但是二者合一就威力無比。

罪之一:對搜索引擎的支持不好

這其實更像一個大大的諷刺,AJAX的鼻祖是Google,但卻對Google自己支持最不 好了,GMail主界面除過Top和Bottom外沒有一個鏈接就是最形象的諷刺了。雖然Mail本身是個私人的應用系統,但這個無鏈接的設計界面恰恰給 AJAX開了個壞頭。Flash也有同樣有這個毛病。沒有鏈接的web就像森林中迷路的羔羊,這句看似廣告語,其實是web設計的根本原則。

罪之二:編寫複雜、容易出錯

javascript本是是個輕量級的小東西,現在被強迫重用起來,負擔可想而知。 javascript對OOP的支持很少,這就限制了javascript代碼的可重用可封裝等等,從Google Mpa還是其他一些應用中能看到的都是無數的<script src="..."></script>這樣的文件包含,這些除了讓程序員頭昏的更快點,一點好處都沒有。更可怕的是在 javascript中竟然沒有一款順手的Debug軟件,很多寫js的老手到今天還是用最原始的alert("")來調試,splinetech JavaScript HTML Debugger 算是一個看起來還像個樣子的調試器吧,可惜不是免費的,幾十大刀讓我這種窮人只能望而生嘆了。

罪之三:冗餘代碼更多了

和上面說的差不多,層層包含js文件是AJAX的通病,再加上以往的很多服務端代碼現在放到了客戶端,所以每次打開一個頁面會包含很多的無用的js文件也一同下載下來。雖然寬帶越來越普及,但是減少代碼冗餘還是每個web設計者的必修課。

罪之四:破壞了Web的原有標準


什麼叫破壞web標準?這就是破壞了web標準。好好的A標籤放著不用,偏要用span。這種例子很多,flickr中的標題單擊後可以更改,這雖然(也包括我)是大家一致叫好覺得方便的設計,但同時這也是歧義了web元素本身的含義,物是人非這個詞不知道用的合不合適?

罪之五:缺少一個沒有標準之爭、沒有back和history的瀏覽器

哈哈,這句話語有點諷刺意義。現在的瀏覽器市場,不管是IE還是FireFox還是 Opera等等。瀏覽器和瀏覽器之間的差異一直都是web設計者心中永遠的痛,支持的css不一樣,支持的客戶端腳本不一樣,有的竟然連客戶端腳本的用法 都有不同。這讓程序員非常苦惱,最明顯的就是調用xmlhttprequest了,req=(window.XMLHttpRequest)?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");這段創建xmlhttp對象的代碼就是為了適應IE和非IE兩天陣營的瀏覽器的 經典例子。說是沒有back和沒有history的瀏覽器,這也是一個諷刺,主要是指在AJAX下點擊鏈接是不Redirect頁面,所以不存在後退和前 進了,同樣,沒有後退和前進也就無存找瀏覽歷史紀錄了。back和history存在的根本就是url的改變,在AJAX下人們發現不改url也同樣能達
到內容改變這個酷酷的特點,何樂而不為呢?look http://www.dux2005.org/http://www.zagodesign.com/ ,我承認這兩個站確實做得非常棒,但除了酷酷的感覺外,毫無用處。

罪之六:XML只是用來打幌子

xml從誕生那天起就被一致看好,大有非xml不娶之勢,我想Jesse James Garrett也是為了趨於流行才把xml強行加入ajax的吧。xml有一個致命的缺點,那就是加載的資源耗費,這好像是所有平台下xml的通病。 google map雖然是Jesse James Garrett推薦的AJAX的品牌代言人,但是gmap並沒有用xml,而是用了原生的javascript數組,我自己在用AJAX從服務端傳回數據 時也從來不用XML,因為它讓我更繁瑣讓系統更慢。服務端首先要調用xml對要傳輸的數據進行封裝,客戶端得到數據後再調用xml進行解析,簡直是畫蛇添 足。AJAX的一個重要特點是要身法輕盈,數據的傳輸儘量單一和簡陋,如果確實需要傳輸大量複雜的數據,也應該通過多次調用傳回。

罪之七:世界這麼大卻找不到自己的家


AJAX適用於什麼?能幹什麼?能帶來什麼?在網站上用AJAX那是笑話,除非像 Google Map和Flickr這樣的專業領域的網站外,普通網站根本沒必要用這個技術;在龐大的企業應用市場估計還能有AJAX的一點容身之地,不過在MS、 SUN不會看著AJAX這個野孩子來在他們的地盤上撒潑的,如果大家都用AJAX,那java給誰賣?.net給誰賣?所以AJAX在企業應用也不是長久 之地。所以,AJAX現在找不到自己合適的位置是個很大的尷尬。疑病亂投醫,最近把AJAX的矛頭指向Flash和Applet就是一個例子。

當然,我也不是要把AJAX扁的一無是處,我本人就非常喜歡這門技術,它能讓web設計者的眼球更加寬廣,讓一些大膽的設計成為現實,但是我也會很冷靜的小心翼翼的利用這個利器,利器雖好,一不留神刺傷的是自己。

PS:這篇文章是昨晚寫的,今早卻神奇般的從網上看見了一篇文章Ajax: 99% Bad,文章是針對2000年那片著名的Flash: 99% Bad 寫的,其中的觀點和我所說的七宗罪中的幾宗相似。

冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]駁「AJAX 的七宗罪」
駁「AJAX 的七宗罪」

(AJA X的七宗罪: http://tech.163.com/05/1009/18/1VL1PAP300091589.html

我不帶任何主觀色彩來評一下這個所謂的 「AJAX 的七宗罪」。

1、連帶著 Flash 和 Ajax 一塊罵了。

引用: 沒有鏈接的web就像森林中迷路的羔羊,這句看似廣告語,其實是web設計的根本原則。

這句「原則」至少我並不知道,因此看起來不過就是一句廣告語而已。我的原則是 Web 應用首先需要對於最終用戶友好,然後才需要考慮對於搜索引擎友好。你使用 HTML FORM 提交的數據也是沒有鏈接的,這些數據可以被搜索引擎搜索到嗎?換句話說,可以添加在鏈接 URL 中的只有通過 GET 方法發送的請求。搜索引擎難道連使用 POST 方法提交的 FORM 數據都能搜索到嗎?如果搜索引擎能搜索到這些數據,搜索引擎搜索到同樣通過 HTTP 協議以明文形式發送的 XML 數據難道是很困難的事情嗎?


必須要考慮對於搜索引擎友好的應用也是有限的。你以為 Google 真的沒有辦法解決這些問題嗎?太小看 Google 了吧?

2、這個作者顯然很少做 JavaScirpt 開發,以至於說出這樣沒有調查的話來:

引用: 更可怕的是在javascript中竟然沒有一款順手的Debug軟 件,很多寫js的老手到今天還是用最原始的alert("")來調試,splinetech JavaScript HTML Debugger 算是一個看起來還像個樣子的調試器吧,可惜不是免費的,幾十大刀讓我這種窮人只能望而生嘆了。

M$ Visual InterDev、Office 2003 中帶的 Script Debugger 都是非常好用的調試工具。如果不願意花錢買這些工具,還可以使用 Mozilla 開發的 Venkman,調試功能已經非常完善了。說 JS 沒有很好的 IDE 是實情,說 JS 沒有很好的調試工具簡直是天大的笑話。

3、

引用: 和上面說的差不多,層層包含js文件是AJAX的通病,再加上以往的很多服務端代碼現在放到了客戶端,所以每次打開一個頁面會包含很多的無用的js文件也一同下載下來。雖然寬帶越來越普及,但是減少代碼冗餘還是每個web設計者的必修課。


完全是沒有調查的胡說,如果通過不同的文件對於 JS 代碼進行了認真的組織,將 JS 函數分到很多小文件中,一個頁面僅僅只需要加載它自己使用到的 JS 文件,何來冗餘代碼之說?

4、 引用: 什麼叫破壞web標準?

<span onclick="location.href="/detail/";">點擊查看全部</a>
,這就是破壞了web標準。好好的A 標籤放著不用,偏要用span。這種例子很多,flickr中的標題單擊後可以更改,這雖然(也包括我)是大家一致叫好覺得方便的設計,但同時這也是歧義 了 web元素本身的含義,物是人非這個詞不知道用的合不合適?

這僅僅是一個具體應用中的用法,居然也歸到了 Ajax 頭上,真是欲加之罪,何患無詞。這裡如果簡單地將 span 換成 a 難道不是很容易的事情嗎?如果使用 a 就不能使用 onclick 了嗎?按照作者的想法,似乎所有的 a 都應該只能是簡單鏈接,不能加上 onclick,加上 onclick 就變成了 Ajax,就觸犯了天條,破壞了 Web 標準。況且給 span 加上一個 onclick 居然就上綱上線到破壞 Web 標準的層次,我研究 Web 標準這麼多年,也沒有看出究竟破壞了哪一款哪一條的 Web 標準。Web 標準中什麼地方規定只允許使用 a,不允許使用 span
來實現了?況且在最新的 XHTML 1.2 標準中,a 已經變成了一個不推薦使用的標記。什麼是 Web 標準,什麼是破壞 Web 標準?回去翻翻書吧。

5、

引用: 瀏覽器和瀏覽器之間的差異一直都是web設計者心中永遠的痛,支持的 css不一樣,支持的客戶端腳本不一樣,有的竟然連客戶端腳本的用法都有不同。這讓程序員非常苦惱,最明顯的就是調用xmlhttprequest了, req=(window.XMLHttpRequest)?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");這段創建xmlhttp對象的代碼就是為了適應IE和非IE兩天陣營的瀏覽器的 經典例子。說是沒有back和沒有history的瀏覽器,這也是一個諷刺,主要是指在AJAX下點擊鏈接是不Redirect頁面,所以不存在後退和前 進了,同樣,沒有後退和前進也就無存找瀏覽歷史紀錄了。back和history存在的根本就是url的改變,在AJAX下人們發現不改url也同樣能達 到內容改變這個酷酷的特點,何樂而不為呢?

我提到過多次《網站重構》,這本書要解決什麼問題?femto 開始讀了嗎?曾經產生過讀這本書的慾望嗎?


創建 XMLHTTP 對象的不同語法只是一個非常小的問題,這是在 XMLHTTP 沒有被完全標準化之前的暫時問題。現在基於 Web 標準做開發,必須要寫針對不同瀏覽器的代碼片斷的場合已經非常少了,封裝這些差異的 JS 庫網上也已經有很多了。

無法利用 back/history 的問題在 Google Maps 中是使用 IFrame 來解決的,這個問題我在 BEA User Group 的演講中已經說過了。

6

引用: xml有一個致命的缺點,那就是加載的資源耗費,這好像是所有平台下 xml的通病。google map雖然是Jesse James Garrett推薦的AJAX的品牌代言人,但是gmap並沒有用xml,而是用了原生的javascript數組,我自己在用AJAX從服務端傳回數據 時也從來不用 XML,因為它讓我更繁瑣讓系統更慢。服務端首先要調用xml對要傳輸的數據進行封裝,客戶端得到數據後再調用xml進行解析,簡直是畫蛇添足。

致命嗎?我做了這麼多瀏覽器端的 XML 開發,為什麼至今沒有感受到?Google Maps 服務器端傳給客戶端的數據就是不折不扣的 XML,其它的開發人員還可以對這個 XML 進行定製加入自己的數據。Google Maps 還在客戶端幾個功能上使用了 XSLT。說 Google Maps 沒有使用 XML,要不要我把我親自整理過的 Google Maps
客戶端的代碼發給你你才能閉嘴?

7、

引用: AJAX適用於什麼?能幹什麼?能帶來什麼?在網站上用AJAX那是笑 話,除非像Google Map和Flickr這樣的專業領域的網站外,普通網站根本沒必要用這個技術;在龐大的企業應用市場估計還能有AJAX的一點容身之地,不過在MS、 SUN不會看著AJAX這個野孩子來在他們的地盤上撒潑的,如果大家都用AJAX,那java給誰賣?.net給誰賣?所以AJAX在企業應用也不是長久 之地。所以,AJAX現在找不到自己合適的位置是個很大的尷尬。疑病亂投醫,最近把AJAX的矛頭指向Flash和Applet就是一個例子。

又是一番奇談怪論。說大公司不會使用 Ajax 完全是主觀臆測。事實上,大量使用客戶端 JS 的大公司包括以下這些:

Macromedia:在 Dreamweaver 產品中包括了大量的 JS 代碼。

Oracle:很多產品都使用了 JS,目前對於 Ajax 很感興趣。這個消息是我在深圳 Oracle 做開發的一個朋友親口告訴我的。

SAP:早在很多年以前,SAP 就在其產品中大量使用了 JS+XMLHTTP 的技術,僅僅是 SAP 沒有炒做這個概念而已。說 Ajax 不適合企業應用,SAP 是靠做什麼吃飯的?

Google:我已經不需要再說什麼了。

前一個主題 | 下一個主題 | | | |

討論串




Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|