活用 Yahoo! 所提供的 JavaScript 函式庫
http://www.josephjiang.com/presentation/osdc/yui.html本人也負責「校園徵才」的活動,但是今天主題是技術分享,有興趣的就自己點進去看嚕!
指一些共用的 function,例如 DOM Collection 就是強化原本 JavaScript 對 DOM 的操作不足所增加的 Library,Event 則是強化對事件處理的部分。Utilities 可以說是讓你操作 JavaScript 可以更得心應手。
這些絕世武器就是各種好用的「控制項」,譬如最近 Yahoo! 搜尋的關鍵字建議功能,就是利用 AutoComplete 這個函式庫建立起來的
另外像是我們在首頁所看到的頁籤組,我們則可以利用 TabView 來輕鬆達成(那時候沒有得要自己寫、超痛苦的...)
若要使用 YUI Grid,你就不能用為定義 DocType 的 Quirks Mode,而要採用 Standard Mode
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
你需要引用 reset.css, fonts.css, grid.css 這三隻外部的 CSS
<link rel="stylesheet" type="text/css"
href="http://yui.yahooapis.com/2.2.0/build/reset/reset.css">
<link rel="stylesheet" type="text/css"
href="http://yui.yahooapis.com/2.2.0/build/fonts/fonts.css">
<link rel="stylesheet" type="text/css"
href="http://yui.yahooapis.com/2.2.0/build/grids/grids.css">
貼心的 YUI, 把所需要的 CSS 合併成一隻,這樣就可以減少 Request:
<link rel="stylesheet" type="text/css"
href="http://yui.yahooapis.com/2.2.0/build/reset-fonts-grids/reset-fonts-grids.css">
<!-- #doc 為標準 750px 版面、.yui-t4 為右欄為 180 的版型 -->
<div id="doc" class="yui-t4">
<div id="hd"></div>
<div id="bd">
<!-- 這裡在 #yui-main 的 .yui-b 放置主要內容 -->
<div id="yui-main">
<div class="yui-b"></div>
</div>
<!-- 這裡的 .yui-b 為側邊欄 -->
<div class="yui-b"></div>
</div>
<div id="ft"></div>
</div>
| Template Class | Preset Description | Example |
|---|---|---|
| .yui-t1 | 側邊欄在左、寬 160px | Example |
| .yui-t2 | 側邊欄在右、寬 160px | Example |
| .yui-t3 | 側邊欄在左、寬 300px | Example |
| .yui-t4 | 側邊欄在右、寬 180px | Example |
| .yui-t5 | 側邊欄在右、寬 240px | Example |
| .yui-t6 | 側邊欄在右、寬 300px | Example |
| .yui-t7 | 只有一欄滿版 | Example |
如果以上標準的版面或版型都不符合您的需求該怎麼辦呢?譬如說你想要一個總寬度為 980px、三欄式的版位該怎麼辦呢?YUI CSS Grid 同樣地也提供了自訂頁面寬度、以及 Nesting Grids 的使用。欲知詳情請點選此連結。
有鑑於此,YUI 便提供了 YAHOO Global Object (yahoo.js) 來定義 YUI 所需的命名空間
| Utility 名稱 | 命名空間 |
|---|---|
| Animation | YAHOO.util.Anim |
| Connection Manager | YAHOO.util.Connection |
| Drag and Drop | YAHOO.util.DD |
| DOM | YAHOO.util.DOM |
| Event | YAHOO.util.Event |
| 控制項名稱 | 命名空間 |
|---|---|
| AutoComplete | YAHOO.widget.AutoComplete |
| Calendar | YAHOO.widget.Calendar |
| Container | YAHOO.widget.Container, YAHOO.widget.Panel, YAHOO.widget.Tooltip, YAHOO.widget.Dialog, YAHOO.widget.SimpleDialog |
| Logger | YAHOO.widget.Logger |
| Menu | YAHOO.widget.Menu |
| Slider | YAHOO.widget.Slider |
| TabView | YAHOO.widget.TabView |
| TreeView | YAHOO.widget.TreeView |
Event 提供了非常彈性的綁事件方式,請絕對要把過去在標籤寫 onClick, onLoad, onMouseOver.. 的方式給改掉,讓 JavaScript 與 HTML 完全分開!它提供了下列的好處:
在 Yahoo! 幾乎所有的網頁都是一塊塊模組所組合而成,為了維護方便,我們也只維護一個外部 JavaScript 檔,供所有頁面讀取。在這樣的情況下,我們就很需要:「當 A 模組出現在頁面時,就去執行 A 函式的功能」。onAvailable 就是指當偵測到某 id 存在時,就立刻執行某 funciton。onContentReady,也一樣,不過差別就在其模組內部的 DOM Tree 也必須讀取完畢才會執行。
相信各位都常常從其他網站下載利用 JavaScript 所做出來的小動畫,如跑馬燈。
現在你可以利用 Animation 輕鬆自己做出你想要的動畫特效。
你可以利用 Animation 去改變:
綜合效果:範例程式
DOM Collection 將許多的開發人員會自行撰寫的 DOM 方法都整理出來、並且跨瀏覽器,你可以透過此工具取得元素的物件參考、或設定及取得元素的定位及樣式。
除了我們所熟知本來 DOM 就提供的 getElementById, getElementsByTagName 外,YUI 也提供了數種方式讓開發人員更容易取得物件。以下以 YUD 來代表 YAHOO.util.Dom 這個命名空間。
像上面我們有用 Animation 工具來做一些動畫,但都只是隨便指定結束的位置,但是真的在寫程式的時候,就必須取得相關物件的位置,以讓動畫跑到正確的位置。
有時我們必須動態改變一個元素的外觀,不過例如利用 element.style.display 常會碰到空值的問題,而 element.style.opacity 則是只有在 Firefox 會生效。
另外我們可能會對單一元素一次指定多個 Class,例如 class="mask container last", 如果要新增、取代、或者是檢查是否存在,可能都得自己寫 Regular Expression 做字串處理。但是現在有 YUI DOM, 問題都可以解決嚕!
利用此方法將可以傳回一個元素的 top, right, bottom, left 的四個值
有時我們會希望區塊隨著視窗大小做改變,這時把捲軸去除掉的 Viewport 的高與寬就很好用了。而想把捲軸算進去可用 YUD.getClientHeight(), YUD.getClientWidth();
幫頁面上的元素產生獨一無二的 ID
對 Event、Animation、與 DOM 都瞭解後,看這個 Prototype
Web Application 的精神就是要讓網站用起來跟視窗應用程式一樣,例如新版的 Yahoo! Mail 使用介面類似 Outlook。其中很重要的就是拖拉技術的實踐。
拖拉技術在每個瀏覽器都或多或少有所不同,DragDrop Utility 整合成共用的介面,讓 Developer 可以專注於程式核心上。
眾所皆知的 AJAX / XmlHttpRequest 其實就是一種不利用換頁而發出 Http Request、等待 Server Reponse、最後再輸出到頁面上的一種方式。
還有一些是上上個月 ( 2007/2 ) 才出爐的新貨:
Experimental代表此 Utility 仍在實驗階段,尚未接受廣泛的測試。
由於現今有太多的前端應用程式,像是 AJAX 不換頁更新、或者地圖移動座標,都不會有「上一頁」、「下一頁」的歷史紀錄,在很多時候對於使用者來說會造成許多困擾。這個工具則利用瀏覽器的 Hash (#) 及 Iframe,以達成產生瀏覽歷史記錄的需求。
但是我還蠻衝的,即使目前還在 Experimental,我在知識+的追蹤清單頁已經用了這樣的技術。
這個工具是從 Yahoo! Widget 中的 AutoComplete 及 DataTable 中所分出來的。主要目的是希望不管資料來源是 XML、純文字、JSON、或 JavaScript Function,都能讓應用程式有一個統一的介面、不需要為不同的資料而煩惱。
所有前面提到的 Utility 、簡單來說就是提供了許多好用的 Function。但喜歡 jQuery 或有在用 extJS 的人可不這麼想,因為他們的用法更直覺,例如 YAHOO.util.Event.on(el,'click',doSomething)、它們可以寫成 el.on('click',doSomething),實在是直覺許多,所以 Yahoo 從善如流,提供了 Element 這個 Utility 包裝 DOM 物件、可直接存取一些常用的方法。
(使用範例)你可以看到許多的搜尋引擎都提供了「自動完成」關鍵字的功能,如 Google Suggestion 以及 Yahoo! 奇摩的搜尋頁,這是一個看起來十分複雜的效果,牽扯到許多事件、動畫及資料,但是有了 Yahoo! AutoComplete,你將可以快速產出。
由於 JavaScript 偵錯不容易,所以都會有人說 alert() 是最好的偵錯工具。但是如果你是在 DragDrop onMouseDown 要偵測座標時,用 alert() 可能會讓你的瀏覽器當掉。
而 Logger 精靈就是 alert 偵錯很好的替代品,使用也很方便。
自從 Yahoo! 首頁 2006 年底改版為起點,開始看到許多網站開始採用 Tab 的方式做首頁資訊的呈現,如蕃薯藤和近期改版的蘋果日報。Tab 的原理不過就只是 style.display 的切換,但是他也可以很複雜的涉及到輪撥、點選用 AJAX 才載入。Tab View 提供了很 Flexible 的功能,讓你能面面兼顧!
想點選照片後、直接在本頁放大嗎?想要輕鬆做出 AJAX 的轉場效果嗎?覺得用系統內建的 alert(), confirm() 很醜嗎?想要直接跳出表單與使用者互動嗎?Container Family 是你最好的選擇!
想點選照片後、直接在本頁放大嗎?想要輕鬆做出 AJAX 的轉場效果嗎?覺得用系統內建的 alert(), confirm() 很醜嗎?想要直接跳出表單與使用者互動嗎?Container Family 是你最好的選擇!
經過這一連串的介紹之後,相信你會對 Yahoo! UI Library 有一些認識:
Yahoo! 很重視原始碼的意義 : Don't pollute your code!。有一些 Library 雖然產出很快,把都不顧 Web Standard 的實際精神。如果你也是追求「極致手工業」的一員,YUI 相信是你不錯的選擇。
拿 TabView 來說,即使使用者介面不支援 JavaScript,他還是可以瀏覽內容。
希望今天的 Demo 能讓大家對 Yahoo! UI Library 開始著迷~ 如果有場合及機會,我會持續地推廣及介紹地更詳細,也歡迎大家來信與我交流

