![]() |
級別: 初級
Brett McLaughlin
(
brett@newInstance.com
), 作家,編輯, O'Reilly Media Inc.
2006 年 1 月 04 日 Ajax 由 HTML、JavaScript? 技術、DHTML 和 DOM 組成,這一杰出的方法可以將笨拙的 Web 界面轉化成交互性的 Ajax 應用程序。 本系列 的作者是一位 Ajax 專家,他演示了這些技術如何協同工作 —— 從總體概述到細節的討論 —— 使高效的 Web 開發成為現實。他還揭開了 Ajax 核心概念的神秘面紗,包括 XMLHttpRequest 對象。<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --> <!--END RESERVED FOR FUTURE USE INCLUDE FILES--> 五年前,如果不知道 XML,您就是一只無人重視的丑小鴨。十八個月前,Ruby 成了關注的中心,不知道 Ruby 的程序員只能坐冷板凳了。今天,如果想跟上最新的技術時尚,那您的目標就是 Ajax。 但是,Ajax 不 僅僅 是一種時尚,它是一種構建網站的強大方法,而且不像學習一種全新的語言那樣困難。 但在詳細探討 Ajax 是什么之前,先讓我們花幾分鐘了解 Ajax 做 什么。目前,編寫應用程序時有兩種基本的選擇:
兩 者是類似的,桌面應用程序通常以 CD 為介質(有時候可從網站下載)并完全安裝到您的計算機上。桌面應用程序可能使用互聯網下載更新,但運行這些應用程序的代碼在桌面計算機上。Web 應用程序運行在某處的 Web 服務器上 —— 毫不奇怪,要通過 Web 瀏覽器訪問這種應用程序。 不過, 比這些應用程序的運行代碼放在何處更重要的是,應用程序如何運轉以及如何與其進行交互。桌面應用程序一般很快(就在您的計算機上運行,不用等待互聯網連 接),具有漂亮的用戶界面(通常和操作系統有關)和非凡的動態性。可以單擊、選擇、輸入、打開菜單和子菜單、到處巡游,基本上不需要等待。 另一方面,Web 應用程序是最新的潮流,它們提供了在桌面上不能實現的服務(比如 Amazon.com 和 eBay)。但是,伴隨著 Web 的強大而出現的是等待,等待服務器響應,等待屏幕刷新,等待請求返回和生成新的頁面。 顯然這樣說過于簡略了,但基本的概念就是如此。您可能已經猜到,Ajax 嘗試建立桌面應用程序的功能和交互性,與不斷更新的 Web 應用程序之間的橋梁。可以使用像桌面應用程序中常見的動態用戶界面和漂亮的控件,不過是在 Web 應用程序中。 還等什么呢?我們來看看 Ajax 如何將笨拙的 Web 界面轉化成能迅速響應的 Ajax 應用程序吧。 在 談到 Ajax 時,實際上涉及到多種技術,要靈活地運用它必須深入了解這些不同的技術(本系列的頭幾篇文章將分別討論這些技術)。好消息是您可能已經非常熟悉其中的大部 分技術,更好的是這些技術都很容易學習,并不像完整的編程語言(如 Java 或 Ruby)那樣困難。
下面是 Ajax 應用程序所用到的基本技術:
我們來進一步分析這些技術的職責。以后的文章中我將深入討論這些技術,目前只要熟悉這些組件和技術就可以了。對這些代碼越熟悉,就越容易從對這些技術的零散了解轉變到真正把握這些技術(同時也真正打開了 Web 應用程序開發的大門)。
要了解的一個對象可能對您來說也是最陌生的,即
清單 1. 創建新的 XMLHttpRequest 對象
下一期文章中將進一步討論這個對象,現在要知道這是處理所有服務器通信的對象。繼續閱讀之前,先停下來想一想:通過
在一般的 Web 應用程序中,用戶填寫表單字段并單擊 Submit 按鈕。然后整個表單發送到服務器,服務器將它轉發給處理表單的腳本(通常是 PHP 或 Java,也可能是 CGI 進程或者類似的東西),腳本執行完成后再發送回全新的頁面。該頁面可能是帶有已經填充某些數據的新表單的 HTML,也可能是確認頁面,或者是具有根據原來表單中輸入數據選擇的某些選項的頁面。當然,在服務器上的腳本或程序處理和返回新表單時用戶必須等待。屏 幕變成一片空白,等到服務器返回數據后再重新繪制。這就是交互性差的原因,用戶得不到立即反饋,因此感覺不同于桌面應用程序。
Ajax 基本上就是把 JavaScript 技術和
然后,服務器 將數據返回 JavaScript 代碼(仍然在 Web 表單中),后者決定如何處理這些數據。它可以迅速更新表單數據,讓人感覺應用程序是立即完成的,表單沒有提交或刷新而用戶得到了新數據。 JavaScript 代碼甚至可以對收到的數據執行某種計算,再發送另一個請求,完全不需要用戶干預!這就是
得到
對于前兩點,需要非常熟悉
清單 2. 用 JavaScript 代碼捕獲和設置字段值
這里沒有特別需要注意的地方,真是好極了!您應該認識到這里并沒有非常復雜的東西。只要掌握了
最后還有 DOM,即文檔對象模型。可能對有些讀者來說 DOM 有點兒令人生畏,HTML 設計者很少使用它,即使 JavaScript 程序員也不大用到它,除非要完成某項高端編程任務。大量使用 DOM 的 是 復雜的 Java 和 C/C++ 程序,這可能就是 DOM 被認為難以學習的原因。 幸 運的是,在 JavaScript 技術中使用 DOM 很容易,也非常直觀。現在,按照常規也許應該說明如何使用 DOM,或者至少要給出一些示例代碼,但這樣做也可能誤導您。即使不理會 DOM,仍然能深入地探討 Ajax,這也是我準備采用的方法。以后的文章將再次討論 DOM,現在只要知道可能需要 DOM 就可以了。當需要在 JavaScript 代碼和服務器之間傳遞 XML 和改變 HTML 表單的時候,我們再深入研究 DOM。沒有它也能做一些有趣的工作,因此現在就把 DOM 放到一邊吧。
有了上面的基礎知識后,我們來看看一些具體的例子。
還記得幾年前的那些討厭的瀏覽器戰爭嗎?沒有一樣東西在不同的瀏覽器上得到同樣的結果。不管您是否相信,這些戰爭仍然在繼續,雖然規模較小。但令人奇怪的是,
Microsoft 瀏覽器 Internet Explorer 使用 MSXML 解析器處理 XML(可以通過 參考資料 進一步了解 MSXML)。因此如果編寫的 Ajax 應用程序要和 Internet Explorer 打交道,那么必須用一種特殊的方式創建對象。
但并不是這么簡單。根據 Internet Explorer 中安裝的 JavaScript 技術版本不同,MSXML 實際上有兩種不同的版本,因此必須對這兩種情況分別編寫代碼。請參閱
清單 3
,其中的代碼在 Microsoft 瀏覽器上創建了一個
清單 3. 在 Microsoft 瀏覽器上創建 XMLHttpRequest 對象
您對這些代碼可能還不完全理解,但沒有關系。當本系列文章結束的時候,您將對 JavaScript 編程、錯誤處理、條件編譯等有更深的了解。現在只要牢牢記住其中的兩行代碼:
和
這兩行代碼基本上就是嘗試使用一個版本的 MSXML 創建對象,如果失敗則使用另一個版本創建該對象。不錯吧?如果都不成功,則將
如果選擇的瀏覽器不是 Internet Explorer,或者為非 Microsoft 瀏覽器編寫代碼,就需要使用不同的代碼。事實上就是 清單 1 所示的一行簡單代碼:
這行簡單得多的代碼在 Mozilla、Firefox、Safari、Opera 以及基本上所有以任何形式或方式支持 Ajax 的非 Microsoft 瀏覽器中,創建了
關鍵是要支持 所有 瀏覽器。誰愿意編寫一個只能用于 Internet Explorer 或者非 Microsoft 瀏覽器的應用程序呢?或者更糟,要編寫一個應用程序兩次?當然不!因此代碼要同時支持 Internet Explorer 和非 Microsoft 瀏覽器。 清單 4 顯示了這樣的代碼。 清單 4. 以支持多種瀏覽器的方式創建 XMLHttpRequest 對象
現在先不管那些注釋掉的奇怪符號,如
最后,
安 全性如何呢?現在瀏覽器允許用戶提高他們的安全等級,關閉 JavaScript 技術,禁用瀏覽器中的任何選項。在這種情況下,代碼無論如何都不會工作。此時必須適當地處理問題,這需要單獨的一篇文章來討論,要放到以后了(這個系列夠 長了吧?不用擔心,讀完之前也許您就掌握了)。現在要編寫一段健壯但不夠完美的代碼,對于掌握 Ajax 來說就很好了。以后我們還將討論更多的細節。
現在我們介紹了 Ajax,對
還缺少什么呢?到底如何使用
您已經有了一個嶄新的
清單 5 中的示例 Ajax 方法就是按照這個順序組織的: 清單 5. 發出 Ajax 請求
其中大部分代碼意義都很明確。開始的代碼使用基本 JavaScript 代碼獲取幾個表單字段的值。然后設置一個 PHP 腳本作為鏈接的目標。要注意腳本 URL 的指定方式,city 和 state(來自表單)使用簡單的 GET 參數附加在 URL 之后。
然后打開一個連接,這是您第一次看到使用
最后,使用值
如果沒有發現任何新鮮的東西,您應該體會到這是多么簡單明了!除了牢牢記住 Ajax 的異步特性外,這些內容都相當簡單。應該感激 Ajax 使您能夠專心編寫漂亮的應用程序和界面,而不用擔心復雜的 HTTP 請求/響應代碼。 清單 5 中的代碼說明了 Ajax 的易用性。數據是簡單的文本,可以作為請求 URL 的一部分。用 GET 而不是更復雜的 POST 發送請求。沒有 XML 和要添加的內容頭部,請求體中沒有要發送的數據;換句話說,這就是 Ajax 的烏托邦。 不 用擔心,隨著本系列文章的展開,事情會變得越來越復雜。您將看到如何發送 POST 請求、如何設置請求頭部和內容類型、如何在消息中編碼 XML、如何增加請求的安全性,可以做的工作還有很多!暫時先不用管那些難點,掌握好基本的東西就行了,很快我們就會建立一整套的 Ajax 工具庫。 現在要面對服務器的響應了。現在只要知道兩點:
其中的第一點,即就緒狀態,將在下一篇文章中詳細討論,您將進一步了解 HTTP 請求的階段,可能比您設想的還多。現在只要檢查一個特定的值(4)就可以了(下一期文章中還有更多的值要介紹)。第二點,使用
清單 6. 處理服務器響應
這些代碼同樣既不難也不復雜。它等待服務器調用,如果是就緒狀態,則使用服務器返回的值(這里是用戶輸入的城市和州的 ZIP 編碼)設置另一個表單字段的值。于是包含 ZIP 編碼的
細心的讀者可能注意到
還有什么呢?實際上沒有多少了。一個 JavaScript 方法捕捉用戶輸入表單的信息并將其發送到服務器,另一個 JavaScript 方法監聽和處理響應,并在響應返回時設置字段的值。所有這些實際上都依賴于 調用 第一個 JavaScript 方法,它啟動了整個過程。最明顯的辦法是在 HTML 表單中增加一個按鈕,但這是 2001 年的辦法,您不這樣認為嗎?還是像 清單 7 這樣利用 JavaScript 技術吧。 清單 7. 啟動一個 Ajax 過程
如果感覺這像是一段相當普通的代碼,那就對了,正是如此!當用戶在 city 或 state 字段中輸入新的值時,
現在您可能已經準備開始編寫第一個 Ajax 應用程序了,至少也希望認真讀一下
參考資料
中的那些文章了吧?但可以首先從這些應用程序如何工作的基本概念開始,對
現在先花點兒時間考慮考慮 Ajax 應用程序有多么強大。設想一下,當單擊按鈕、輸入一個字段、從組合框中選擇一個選項或者用鼠標在屏幕上拖動時,Web 表單能夠立刻作出響應會是什么情形。想一想 異步 究竟意味著什么,想一想 JavaScript 代碼運行而且 不等待 服務器對它的請求作出響應。會遇到什么樣的問題?會進入什么樣的領域?考慮到這種新的方法,編程的時候應如何改變表單的設計? 如果在這些問題上花一點兒時間,與簡單地剪切/粘貼某些代碼到您根本不理解的應用程序中相比,收益會更多。在下一期文章中,我們將把這些概念付諸實踐,詳細介紹使應用程序按照這種方式工作所需要的代碼。因此,現在先享受一下 Ajax 所帶來的可能性吧。 |
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
