Ajax 板


LINE

大概從2005年迄今 , 在當時幾乎非程式人員都不知道ajax , 到現在幾乎當紅的網站都打著 ajax的名號 , 筆者印象很深刻的是 , 2006年我開始正式接觸碰ajax的時候 , 就在ajax版留下「why ajax」的文章 , 雖然沒得到什麼回應 . 後來也緊接著就寫出屬於自己包裝過的介面跟試用dojo, 很多東西並不是很難或是很高深莫測 , 有時候就只是差一個「介紹」。 如果還有認為ajax很神秘的朋友 , 這篇文章讓我們就ajax本質重新討論起, 筆者曾經在討論這個問題時被說成是個ajax基本教義者 ,不過了解工具 , 絕對是能妥善發揮工具威力的必要條件. AJAX = Asynchronous JavaScript and XML 非同步javascript & xml ──────────────────────────────── @ ajax 是新東西嗎? 在ajax剛竄起來時 , 大多數人都把它當作一個新技術來講 , 但是實際上他只是個coding技巧 , 一個類iframe , 類frame的技巧. 事實上你大部分狀況可以用iframe達到非常接近的效果 , 它其實存在很久了 , 而之所以很久很久以前沒人這樣用 ,有其歷史性因素. @ ajax是什麼? 我們知道傳統網頁間溝通的方法是透過 form(表單) 做submit(遞交), 而 ajax 就是允許你不需要透過一個真正的form submit , 而透過發送要求(request) 來模擬一個form進行 get / post的處理 , 並能從request成員取得目標頁面的html source 來透過js進行對應的處理. 這代表著我們不再需要那些因為submit而來的頁面跳轉 , 而只要不斷發request , 等待伺服器給我們回應就好 , 在理論上是有可以把網站作成單一頁面的能力 , 也的確有網站這麼做 , 但是是不是應該/值得這麼做 , 我們將選擇權交給讀者 , 在文章末我們會再探討ajax所帶來的問題. 當然 , 以上這些都是都是以 javascript 為基礎進行的. @ajax的優點 1.即時的互動 2.簡化page loading. 將頁面切割成零碎的子頁面,僅取所需. 3.具多數共用的檔案如 核心 js檔等 , 可避免多次重複載入或讀取. 4.方便工具型(或稱application型網頁),同時進行多種任務. 如google doc,gmail等 5.可以跟客戶炫耀你用了ajax (誤) 底下我們先來聊聊為什麼 ajax 在這幾年才比較火熱。 @ajax歷史因素之一:伺服器端技術的成熟度 從cgi留言板流行到現在五花八門的語言 , 甚至做到電子商務跟線上刷卡 , 這些在八九年前筆者及大眾還視為洪流猛獸敬而遠之 , 伴隨著科技的進步 , 伺服器端的支援發展出更多可能性 , 人們的接受度也提高, 很慶幸我們現在生活在這樣現代化的社會之中. ajax 的主要優點在於小幅的跨頁傳輸 , 在早期伺服器端沒辦法提供妥善的資料支援的前題下 , ajax可說是自廢武功. 有這種需求的大多投向 flash或applet的懷抱(早期applet是很火熱的), 一般而言幾乎不會特地用ajax去call一個靜態頁面. @ajax歷史因素之二:平台標準不一 另一方面則是ie6及firefox對xmlhttprequest的支援度不一 , 導致要取得一個要求發送者(xmlhttprequest) , 都變成一個很難的任務. 看看底下這段開發者應該不陌生的函式 ,層層包疊的try & catch 就是 每一種支援與不支援的可能性. function getXMLHttpRequest(){ var request; try { request = new XMLHttpRequest(); } catch (trymicrosoft) { try { request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (othermicrosoft) { try { request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (failed) { request = false; } } } if (!request) alert("Error initializing XMLHttpRequest!"); return request; } @ajax歷史因素之三:破碎的網頁設計法則尚待訓練。 ajax 等於就是把傳統一個大網站拆成片段的小網頁 , 開始把網頁 作成不只是網頁 , 而是一個「網塊」, 如果沒有ajax設計經驗的朋友 可以想像一下如 gmail或igoogle那類一塊一塊進行即時處理的區塊. 這樣的設計概念並不只是把一個小網頁給塞進去 , 而是一種需要全面性去思考的新網頁流程 , 讓我舉一個很有趣的例子. 傳統我們常常會送出submit一個頁面之後 , 確認完成再導向另一個頁面, 但是在ajax情境下 , 如果你透過ajax 非同步submit這樣的頁面 , 你就很有可能取得導向另一個頁面之後的結果! 就ajax進行而言 , 他比較需要的是是否完成的訊號跟提示訊息, 原本我們用ajax 希望能簡化page loading的目的 , 也就達不到了. 為此其實網站開發者都還在摸索 , 希望能找出一個比較實用的開發管道. 我們接下來先介紹ajax本身的用法 , 再來繼續討論延伸的議題. @怎麼做 ajax ? (非同步的發出請求) 首先你需要一個request , 你可以透過本篇前文中所敘述的函式來取得. 我們先以比較簡單的get方法來做說明就好, 有需要純js 做post的資料 , 請參考 #15aVHpQB (Ajax) 這篇文章中所用到的方案。 /*取得request*/ var request= getXMLHttpRequest(); /*開啟request資料*/ request.open("GET", "target.jsp?param1=hi&param2=hello", true); /*設定當網頁讀取狀況更新時要進行的行為*/ request.onreadystatechange = function(){ /* 4是網頁完成時 */ if (request.readyState == 4) { /*正常狀況是200 , 找不到網頁是404(這數字是不是很熟悉?:p)*/ if (request.status == 200) { /*將取到的資料alert出來*/ alert(request.responseText); } else{ /*如果失敗,把失敗的頁面資訊列出來*/ alert(request.responseText); } } }; /*發送request*/ request.send(null); @就這樣? 嗯 , 正如之前所說 , 他並不是個很複雜的概念 , 所以介面上也並不複雜 , 只是因為牽扯到狀態 , 所以比較沒有那麼單純. @等等 , 我們已經扯了這麼久 , 怎麼 jQuery到現在還沒出場啊??? 就猜到你會這麼問 , 在這章底下其實流程遠比工具重要 , 這也是我們花這麼多篇幅介紹流程跟歷史因素的原因 , 當然 jQuery 也有提供簡化用的方案 , 我直接介紹最常用的三個, get/post/load 就好 . $.get(url,params,callback) 要達到與之前的script一樣的效果,只需要 $.get("target.jsp?param1=hi&param2=hello", function(response){ alert(response); } ); 或者是可以把param獨立出來變成 $.get("target.jsp", {param1:"hi",param2:"hello"}, function(response){ alert(response); } ); post的部份 , 也一樣簡單. 基本上只是把字從get換成post而已. $.post("target.jsp", {param1:"hi",param2:"hello"}, function(response){ alert(response); } ); 而load 則是把某個網頁 , load後對特定元素進行html(response)的一個方法. $("#msg").load("target.jsp",{param1:"hi",param2:"hello"}); 這樣的話 , 原本的response就會直接被載入到msg裡面,適合單純讀取頁面用. http://docs.jquery.com/Ajax @2008/11/29補充後文 本篇原稿寫於 2008/08/19 , 但原先設定內容要探討的範圍實在是過大 , 而且也超過筆者當時甚至是目前所能完全掌握的範圍 , 跨到 ajax 以及 server side language 互動的範疇 , 更是涵蓋各種網頁流程設計的技巧 , 很多設計方針現在都尚未有所定論 , 而且像下棋一樣變化萬千 , 難以一一列出演進 . 以至於後半段的介紹遲遲難以下筆,於是將寫好的部份原稿先貼出來 , 希望有一天能夠把這一團思緒好好的整理一下再另闢文章. 筆者認為 ajax 帶來的設計模式是一股時代的洪流 , 包含flash等 RIA體系 , 它不是個很複雜的體制 , 但卻是一個極大的變革 , 以目前網路環境而言 , 也不全然是能看好的發展. 這篇文章技術成份較低 , 與其說教學或分享 , 倒不如說是代表我對ajax結構的迷惘吧! :) -- What do you want to have ? / What do you have? 從書本中,你可以發現我的各種興趣。 從CD中,你可以瞭解我所喜歡的偶像明星。 或許從文字你很難以瞭解一個人,但從物品可以。 My PPolis , My past. http://ppolis.tw/user/Tony --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 221.169.78.140
1F:推 cloudccw:推推 11/29 18:54
2F:推 bazoo:酷 推一個先 11/29 20:22
3F:推 iambonnie:未看先推~~ 11/29 20:26
4F:推 CKone1209:大推!喜歡這一系列文 11/30 02:09
5F:推 icycandle:喔喔喔喔喔,未看先推啊! 11/30 06:26
6F:推 asuka05:整理的不錯 11/30 16:57
TonyQ:轉錄至看板 Web_Design 11/30 17:10







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP