Introduction to Yahoo! UI Library

活用 Yahoo! 所提供的 JavaScript 函式庫

http://www.josephjiang.com/presentation/osdc/yui.html

About Lecturer

precher

為何要使用 YUI ?

  • 像是一把瑞士刀,讓你自己發揮想要的功能,而不只是一個套件。
  • 不改變 JavaScript 程式語言的結構
  • 解決瀏覽器相容的問題
  • 提供 Hosting 直接引用
    您可以直接連到:yui.yahooapis.com 這個有提供 Akamai 的網域。 Akamai 提供了下列的功能:
    • DNS Forwarding
    • GZip
    • Expire Header
  • 完整線上資源:論壇(Yahoo! Group)、說明 (Getting Start)、範例 (Functional Example)、API Documentation
  • 大師的加持:Douglas CrockfordNicholas Zakas
    • Douglas 是 JSON 的提倡者、JavaScript: The World's Most Misunderstood Programming Language 的作者、曾撰寫過 JSMinJSLint 這兩個好用的工具、也是 Yahoo! Namespace 的制訂者。
    • Nicholas 是 Professional JavaScript for Web Developer 的作者
  • 這份 Slide 就是用 YUI 做的 Best Practice 唷!
    我用了以下的工具來做出這份 Slide:
    • CSS : reset.css, fonts.css
    • Utility : Event, DOM, Animation, Browser History Manager, Drag Drop...
    • Widget : Container, TabView
  • 也有一些 JS Library 是基於 YUI 為 Basis 來開發

YUI Family

可將 YUI 分成以下 3 個大區塊:

  • CSS Tools : 打好基礎並建立門面

    在寫網頁時,我們都會發現每個標籤都有自己預設的樣式,請看範例,其實這對我們操作頁面樣式是相當不方便的!我們可能因此沒有符合視覺設計師的要求(字型大小及間距),而且不同的瀏覽器看起來還會不一樣,這實在是太折磨人啦!與其如此,我們還不如將所有預設樣式一開始就歸零!重新撰寫符合我們需求的樣式!

    另外,現在很流行的 CSS 排版你還在用 Table 來做排版?實在太遜了!),我們可以用 YUI Grid 這一組工具輕鬆建立!

  • Utilities : 打通任督二脈

    指一些共用的 function,例如 DOM Collection 就是強化原本 JavaScript 對 DOM 的操作不足所增加的 Library,Event 則是強化對事件處理的部分。Utilities 可以說是讓你操作 JavaScript 可以更得心應手

  • Controls : 擁有火力強大的絕世武器

    這些絕世武器就是各種好用的「控制項」,譬如最近 Yahoo! 搜尋的關鍵字建議功能,就是利用 AutoComplete 這個函式庫建立起來的

    另外像是我們在首頁所看到的頁籤組,我們則可以利用 TabView 來輕鬆達成(那時候沒有得要自己寫、超痛苦的...)

YUI Grids:快速建立 CSS Layout

  • 用 Table 來做排版已經是一件很落伍的事了
    (不瞭解?可以看 Why tables for layout is stupid 這一篇文章)
  • 話說回來,要用 DIV + CSS 做排版,則需要比較強的 CSS 能力,對很多人來說是個痛苦的折磨
  • 折磨啊~
  • YUI 提供了一個很彈性的 CSS 工具叫 YUI Grid,你將可以快速建置各種符合標準的 CSS 版面

YUI Grids:快速建立 CSS Layout

  • Step By Step :
    1. 1. 請使用標準模式

      若要使用 YUI Grid,你就不能用為定義 DocType 的 Quirks Mode,而要採用 Standard Mode

      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    2. 2. 引用所需樣式表

      你需要引用 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">
    3. 3. 撰寫所需的 HTML 結構
      <!-- #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 ClassPreset DescriptionExample
      .yui-t1側邊欄在左、寬 160pxExample
      .yui-t2側邊欄在右、寬 160pxExample
      .yui-t3側邊欄在左、寬 300pxExample
      .yui-t4側邊欄在右、寬 180pxExample
      .yui-t5側邊欄在右、寬 240pxExample
      .yui-t6側邊欄在右、寬 300pxExample
      .yui-t7只有一欄滿版Example

      如果以上標準的版面或版型都不符合您的需求該怎麼辦呢?譬如說你想要一個總寬度為 980px、三欄式的版位該怎麼辦呢?YUI CSS Grid 同樣地也提供了自訂頁面寬度、以及 Nesting Grids 的使用。欲知詳情請點選此連結

  • 神兵利器 「Grid Builderhttp://developer.yahoo.com/yui/grids/builder/

YAHOO! Name Space

  • JavaScript 也有命名空間?
    想必大家對 JAVA, .NET 的命名空間都有所瞭解,但對 JavaScript 有命名空間不一定那麼清楚。
  • JavaScript 的應用日趨複雜
    如果像以往寫了一堆 function(){} 在一起, 必定將十分難以維護、且容易造成命名上的衝突
  • YAHOO Global Object

    有鑑於此,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
  • 定義自己的命名空間
  • 發起人為 Douglas CrockfordJavaScript: The World's most misunderstood programming language
Douglas Crockford

Event:輕輕鬆鬆綁事件

Event 提供了非常彈性的綁事件方式,請絕對要把過去在標籤寫 onClick, onLoad, onMouseOver.. 的方式給改掉,讓 JavaScript 與 HTML 完全分開!它提供了下列的好處:

  • 元素尚未存在也可綁
    相信大家都知道 JavaScript,不能對尚未讀取到的元素做任何指定。 所以我們往往會把 JavaScript 放在最後面,或者把要執行的 Code 用 window.onload 給包起來。 但是 Event 提供了這樣的功能,如果偵測到元素尚未存在,則會自動將之放到頁面讀取完畢再試
  • 自動調整 Scope
    若你利用 Event 來綁,在你自己撰寫的事件處理函式中,你可以用 .target 知道觸發事件的元素、而 this 則是取得你綁的物件
  • 可以一次綁多個物件
    有時我們會需要對多個不同的元素,綁相同的事件處理函式,如果一次只綁一個就太遜了!Event 提供你傳DOM物件DOM物件集合IDID陣列集合
  • 不可不知 : onAvailable, onContentReady

    在 Yahoo! 幾乎所有的網頁都是一塊塊模組所組合而成,為了維護方便,我們也只維護一個外部 JavaScript 檔,供所有頁面讀取。在這樣的情況下,我們就很需要:「當 A 模組出現在頁面時,就去執行 A 函式的功能」。onAvailable 就是指當偵測到某 id 存在時,就立刻執行某 funciton。onContentReady,也一樣,不過差別就在其模組內部的 DOM Tree 也必須讀取完畢才會執行。

  • EVENT DRIVEN PROGRAMMING!

Animation : 讓網頁「動」起來

相信各位都常常從其他網站下載利用 JavaScript 所做出來的小動畫,如跑馬燈。 現在你可以利用 Animation 輕鬆自己做出你想要的動畫特效
你可以利用 Animation 去改變:

  • 尺寸YAHOO.util.Anim,用動畫讓區塊改變大小範例),你可以用於收摺的效果上。 所有的效果,你除了 to 的屬性、你還可以利用 by相對增加與減少(範例
  • 透明度YAHOO.util.Anim,用動畫改變區塊的透明度,輕易做出淡出加深的效果。 (範例
  • 顏色YAHOO.util.ColorAnim,讓區塊中的背景色文字顏色邊框顏色產生漸進式的變化。(範例
  • 位置YAHOO.util.Motion,讓區塊在畫面上移動範例),更酷的是,你還可以增加定位點範例

綜合效果:範例程式

DOM Collection : 輕鬆操作網頁元素

DOM Collection 將許多的開發人員會自行撰寫的 DOM 方法都整理出來、並且跨瀏覽器,你可以透過此工具取得元素的物件參考、或設定及取得元素的定位樣式

  • 取得物件參考

    除了我們所熟知本來 DOM 就提供的 getElementById, getElementsByTagName 外,YUI 也提供了數種方式讓開發人員更容易取得物件。以下以 YUD 來代表 YAHOO.util.Dom 這個命名空間。

    • YUD.get([ID、ID陣列、或DOM物件]), 傳回物件集合。getElementById 畢竟還是有點太多字了,而且一次只能取得一個,我們可以用 DOM 提供的 get 一次取得多個物件參考。
    • YUD.getElementsByClassName([Class名稱],[標籤名稱],[根目錄節點物件]), 傳回物件集合。由於 id 的屬性在一整頁的 HTML 不能重複, 所以我往往都只用在模組名稱上,其他我都是用 class="[something]" 來代表該區塊的意義。所以會很需要以 class 來取得物件。
    • YUD.getElementsBy([運算法(傳回Boolean)],[標籤名稱],[根目錄節點物件]), 傳回物件集合。如果你覺得像 getElementsByClassName 的方法還是不夠用的話,那麼你就可以利用 getElementsBy 來撰寫自己取得物件的方法,像 Dustin Diaz 就寫了一個 getElementsByAttribute 的方法。
  • 取得及設定物件定位

    像上面我們有用 Animation 工具來做一些動畫,但都只是隨便指定結束的位置,但是真的在寫程式的時候,就必須取得相關物件的位置,以讓動畫跑到正確的位置。

    • YUD.getX([ID或物件參考]), 傳回整數
    • YUD.getY([ID或物件參考]), 傳回整數
    • YUD.getXY([ID或物件參考]), 傳回陣列
    • YUD.setX([ID或物件參考],[水平位置]), 無回傳值
    • YUD.setY([ID或物件參考],[垂直位置]), 無回傳值
    • YUD.setXY([ID或物件參考],[水平位置跟垂直位置的陣列]), 無回傳值
  • 取得及設定物件樣式

    有時我們必須動態改變一個元素的外觀,不過例如利用 element.style.display 常會碰到空值的問題,而 element.style.opacity 則是只有在 Firefox 會生效。

    另外我們可能會對單一元素一次指定多個 Class,例如 class="mask container last", 如果要新增、取代、或者是檢查是否存在,可能都得自己寫 Regular Expression 做字串處理。但是現在有 YUI DOM, 問題都可以解決嚕!

    • YUD.getStyle([ID或物件參考], 屬性), 傳回屬性值
    • YUD.setStyle([ID或物件參考], 屬性, 屬性值)
    • YUD.hasClass([ID或物件參考], Class名稱), 傳回 true /false
    • YUD.addClass([ID或物件參考], Class名稱), 無傳回值
    • YUD.replaceClass([ID或物件參考], 舊Class名稱, 新Class名稱), 無傳回值
    • YUD.removeClass([ID或物件參考], Class名稱), 無回傳值
  • 其他有用的方法
    • YUD.getRegion([ID或物件參考]),回傳值為陣列。

      利用此方法將可以傳回一個元素的 top, right, bottom, left 的四個值

    • YUD.getViewportWidth(),傳回值為數字
      YUD.getViewportHeight(),傳回值為數字

      有時我們會希望區塊隨著視窗大小做改變,這時把捲軸去除掉的 Viewport 的高與寬就很好用了。而想把捲軸算進去可用 YUD.getClientHeight(), YUD.getClientWidth();

    • YUD.generateId([元素]),無回傳值。

      幫頁面上的元素產生獨一無二的 ID

對 Event、Animation、與 DOM 都瞭解後,看這個 Prototype

DragDrop : 快速實踐拖拉技巧

Web Application 的精神就是要讓網站用起來跟視窗應用程式一樣,例如新版的 Yahoo! Mail 使用介面類似 Outlook。其中很重要的就是拖拉技術的實踐

YAHOO Mail

Connection Manager : 瘋狂應用 AJAX !

眾所皆知的 AJAX / XmlHttpRequest 其實就是一種不利用換頁發出 Http Request等待 Server Reponse、最後再輸出到頁面上的一種方式。

其它的 Yahoo! Utility

還有一些是上上個月 ( 2007/2 ) 才出爐的新貨

  • Browser History Manager [Experimental]

    Experimental代表此 Utility 仍在實驗階段,尚未接受廣泛的測試。

    由於現今有太多的前端應用程式,像是 AJAX 不換頁更新、或者地圖移動座標,都不會有「上一頁」、「下一頁」的歷史紀錄,在很多時候對於使用者來說會造成許多困擾。這個工具則利用瀏覽器的 Hash (#) 及 Iframe,以達成產生瀏覽歷史記錄的需求。

    但是我還蠻的,即使目前還在 Experimental,我在知識+的追蹤清單頁已經用了這樣的技術。

  • DataSource Utility [Beta]

    這個工具是從 Yahoo! Widget 中的 AutoCompleteDataTable 中所分出來的。主要目的是希望不管資料來源XML純文字JSON、或 JavaScript Function,都能讓應用程式有一個統一的介面、不需要為不同的資料而煩惱。

  • Element Utility [Beta]

    所有前面提到的 Utility 、簡單來說就是提供了許多好用的 Function。但喜歡 jQuery 或有在用 extJS 的人可不這麼想,因為他們的用法更直覺,例如 YAHOO.util.Event.on(el,'click',doSomething)、它們可以寫成 el.on('click',doSomething),實在是直覺許多,所以 Yahoo 從善如流,提供了 Element 這個 Utility 包裝 DOM 物件、可直接存取一些常用的方法。

    使用範例

AutoComplete : 做出自動完成非難事!

你可以看到許多的搜尋引擎都提供了「自動完成」關鍵字的功能,如 Google Suggestion 以及 Yahoo! 奇摩的搜尋頁,這是一個看起來十分複雜的效果,牽扯到許多事件動畫資料,但是有了 Yahoo! AutoComplete,你將可以快速產出。

Logger : 好用的記錄工具

由於 JavaScript 偵錯不容易,所以都會有人說 alert() 是最好的偵錯工具。但是如果你是在 DragDrop onMouseDown 要偵測座標時,用 alert() 可能會讓你的瀏覽器當掉。

而 Logger 精靈就是 alert 偵錯很好的替代品,使用也很方便。

TabView : 大為風行的頁籤組

自從 Yahoo! 首頁 2006 年底改版為起點,開始看到許多網站開始採用 Tab 的方式做首頁資訊的呈現,如蕃薯藤和近期改版的蘋果日報。Tab 的原理不過就只是 style.display 的切換,但是他也可以很複雜的涉及到輪撥點選用 AJAX 才載入Tab View 提供了很 Flexible 的功能,讓你能面面兼顧!

Container : 提供各種互動及呈現內容

想點選照片後、直接在本頁放大嗎?想要輕鬆做出 AJAX 的轉場效果嗎?覺得用系統內建的 alert(), confirm() 很醜嗎?想要直接跳出表單與使用者互動嗎?Container Family 是你最好的選擇!

Container : 提供各種互動及呈現內容

想點選照片後、直接在本頁放大嗎?想要輕鬆做出 AJAX 的轉場效果嗎?覺得用系統內建的 alert(), confirm() 很醜嗎?想要直接跳出表單與使用者互動嗎?Container Family 是你最好的選擇!

DataTable : 簡單卻強大的資料顯示及修改工具

DataTable 可以讓資料來源快速組合成一個 Table,你不再需要再自己 parse 資料。另外也可以讓你直接編輯修改這 Table 上的資料。

結語

經過這一連串的介紹之後,相信你會對 Yahoo! UI Library 有一些認識:

  • 快速產出相比,YUI 更重視函式庫本身的彈性,要讓你可以在許多地方重複利用好修改
  • Semantic!

    Yahoo! 很重視原始碼的意義 : Don't pollute your code!。有一些 Library 雖然產出很快,把都不顧 Web Standard 的實際精神。如果你也是追求「極致手工業」的一員,YUI 相信是你不錯的選擇。

  • 考量到 Downgrade 的 Issue

    拿 TabView 來說,即使使用者介面不支援 JavaScript,他還是可以瀏覽內容

希望今天的 Demo 能讓大家對 Yahoo! UI Library 開始著迷~ 如果有場合及機會,我會持續地推廣介紹地更詳細,也歡迎大家來信與我交流

 

Zzz..
Thank You
Any Questions?
PreviousNext
Yahoo! Front-end Engineer, Joseph Jiang