jquery教學

2017-06-14 22:01:00
==== 文章說明 ==================================================================

作者: RZ Fang
最後修改:2012-10-01

轉載請註明出處: http://skyzone.url.tw

這篇教學是小弟自己在學習 JQuery 一段時間後,
試著依循自己學習過程,嘗試撰寫的入門教學文。

文章很粗淺的介紹 JQuery 的特性,
並透過簡單的函式舉例,直接點出 JQuery 的特性,
藉以讓 您快速領會 JQuery 的設計思維。

==== 認識 JQuery ===============================================================

官網: http://jquery.com/
宗旨: write less, do more.  寫越少的 Code,做更多的事情。

一個 Javascript API (Framework)。

解決多數 Javascript 在不同瀏覽器上的表現差異。
相容性往前一路支援到 IE6。(目前 1.8.0 仍是如此)

AJAX 便利使用的大量實作。

運作效能極佳。

只有一個 JS 檔案。
檔案容量很小。
佈署方式超簡單。

所有功能的命名、設計符合直覺。

==== 程式撰寫思維 ==============================================================

找一個對象,做一些事。

從 $ 號開始。

定位 -> 篩選 -> 偏移 -> 做事

串接式連續操作。

批次處理複數個對象。

==== Selector ==================================================================

$() 的括號中放置的有意義字串。
所謂有意義字串,是一種格式八成近似於 CSS 的文字宣告。

直接舉例最好理解。

$('div')            網頁全內容中的所有 div Element 所封裝成的 JQuery 物件。
                    符合 CSS 運作原理。

$('#SomeID')        一個 ID 為 SomeID 的 Element 所封裝成的 JQuery 物件。
                    符合 CSS 運作原理。

$('.SomeClass')     所有 Class 為 SomeClasss 的 Element 所封裝成的 JQuery 物件。
                    符合 CSS 運作原理。

$('[name=GJ]')      所有屬性中有 name 而且值為 GJ 的 Element 所封裝成的 JQuery 物件。

$('div.SomeClass')  所有 Class 為 SomeClasss 的 div Element 所封裝成的 JQuery 物件。
                    符合 CSS 運作原理。

==== 層級式的 Selector =========================================================

雖然 JQuery 擅長透過簡單語法快速找到 Element,但網頁全文搜尋終究有其瓶頸。
為了進一步提高搜尋效率,同時兼顧減少宣告定義的撰寫,
Selector 也支援 CSS 的搜尋定位方式。

$('#SomeID div')    所有在 ID 為 SomeID 的 Elmenet 底下的 div Element。
                    包含子層級和孫層級。
                    從 #SomeID Element 開始搜尋,避免全文搜尋。
                  
$('#SomeID > div')  所有在 ID 為 SomeID 的 Elmenet 下的子層級 div Element。
                    僅包含子層級。
                    從 #SomeID Element 開始搜尋,避免全文搜尋。
                    
$('.SomeClass div') 所有在 Class 為 SomeClass 的 Element 下的所有子孫層級的 div。
                    只要 div 包含在 .SomeClass 之下,就會被納入。
                    從 .SomeClass Element 開始搜尋,避免全文搜尋。

Q: $('#SomeID > div.SomeClass span[name=GJ]')  代表什麼呢?
A: 找出 ID 為 SomeID 的 Element ,
   在其下找出 Class 為 SomeClass 的 div Element,
   在其下所有層級找出屬性 name 有定義且值為 GJ 的所有 span Element。

==== Attribute & CSS ===========================================================

在透過 Selector 取得對象 Element(s) 所封裝的 JQuery 物件之後,
當然是因為要拿來做點事,例如換掉內容字體顏色、更換 Class 或 ID 等等。
JQuery 雖然將 Element 封裝成自己格式的物件,沒辦法再用 Javascript 的方式(函式),
但與此同時,JQuery 也提供了自己的函式:attr() 和 css()。

舉例:

var JO = $('#SomeID'); // Selector 找到 Element。

var JO_Name = JO.attr('name');  // 取得 Element 的屬性 name 的值。
var JO_Color = JO.css('color'); // 取得 Element 的 CSS style - color 的值。

JO.attr('name', 'GJ');          // 設定 Element 的屬性 name 的值。
JO.css('color', '#ff0000');     // 設定 Element 的 CSS style - color 的值。

JO.attr({'name': 'GJ', 'class': 'SomeClass'});       // 設定 Element 的屬性 name & class 的值。
JO.css({'color': '#ff0000', 'border': '1px solid'}); // 設定 Element 的 CSS style - color & border 的值。

可以留意到,同樣是呼叫 attr() 或 css() 函式,
給一個字串時,表示是 Get;
給一個字串和一個值時,表示是 Set;
給一個物件時,表示針對物件內容,同時執行多個 Set。

==== Traversing ================================================================

往往在對 Element 操作時,不會單單只針對一個 Element 進行調整。
從 Selector 的運作邏輯來看,必須明確找到目標,但若有多個目標必須操作時,
則必須針對每個目標進行 Selector 搜尋。

舉一個例子:
希望設定一個 div 內容的字體顏色為紅色,但希望其下的第一個 span 字體為藍色。

若單用 Selector,則必須進行兩次的設定:
$('div#SomeID').css('color', '#ff0000');
$('div#SomeID > span:first').css('color', '#0000ff');

由 Selector 段落知道,一個 Selector 就代表一次檢搜。
如果期望上例能夠保持最佳效率,以 Selector 方式必然得在 span Element 上加上 ID。
上例尚屬單純,當情況夠複雜時,為每一個 Element 都加上 ID 恐怕是一件耗時的工作。
因此以 Traversing 輔助,變成是一種轉環的解決辦法。

承上例,用 Traversing 輔助時的作法:
$('div#SomeID').css('color', '#ff0000')
               .children('span:first').css('color', '#0000ff');
               
同樣寫了兩行 Code,但實際上只有第一行進行了 Selector 搜尋,
第二行則是延用第一行的搜尋結果,繼續延伸定位其它 Element。
以上例而言,就是從該 div 出發,去找其下的第一個 span,然後將之設定顏色為藍色。

==== 串接式的 JQuery 操作 ======================================================

JQuery 大部分的設定函式,都會回傳該 JQuery 物件本身,這表示在一個函式呼叫後,
可立刻接著另一個函式呼叫。
在結合了 Selector 與 Traversing 後,
JQuery 將對 Element 的搜尋、設定的彈性大大提升。

舉例來說:

對下面 HTML 結構進行調整,希望第一個,最後一個的顏色是紅色,其它為藍色。

<!--v Sample v-->
<div id='SomeID'>
  <span>A</span>
  <span>B</span>
  <span>C</span>
  <span>D</span>
  <span>E</span>
</div>
<!--^ Sample ^-->

則 JQuery 可如此撰寫:

$('div#SomeID > span').css('color', '#0000ff')
                      .first().css('color': '#ff0000')
                              .end()
                      .last().css('color': '#ff0000');

==== Event =====================================================================

由於 JQuery 的事件將 Javascript 的事件再封裝,因此兩者並不完全相等,
甚至於可說是完全不同的東西。
因此在事件的處理上,必須很明確知道該事件是 JQuery 的還是 Javascript 的。

在此僅介紹常用的項目,並未涵蓋 JQuery 全部事件。

bind / unbind
click
live / die  &  delegate / undelegate

==== bind / unbind ====

bind 可說是 JQuery 事件註冊的最基本函式,
許多其它事件註冊函式其實都是轉呼叫 bind 實作而成。

bind 的基本用法如下:
JO.bind([事件名稱字串], [事件觸發要執行的函式]);
如:
$('div#SomeID').bind('click', function(Evt){ alert('被點了'); });

unbind 即 bind 的相反,但有數種使用方式產生不同的結果。
JO.unbind();          將原本註冊在 JO 上的所有事件全部刪除。
JO.unbind('click');   只刪除在 JO 上的 click 事件。

另外必須留意,JQuery 事件並不如同 Javascript 的事件,
可由後面的定義覆蓋掉前面的定義。
當針對一個 JQuery 物件連續定義相同事件時,每一個都會掛載,並在事件觸發時,全部執行。

以下兩段 Code 的效果是不同的:

$('#SomeID').bind('click', function(Evt){ alert('被點了A'); });
$('#SomeID').bind('click', function(Evt){ alert('被點了B'); });

$('#SomeID').bind('click', function(Evt){ alert('被點了A'); });
$('#SomeID').unbind('click');
$('#SomeID').bind('click', function(Evt){ alert('被點了B'); });

==== click ====

click 事件幾乎可註冊在所有 HTML 可視 Element 上。
承 bind 的介紹,事實上 click 在底層只是轉呼叫 bind('click') 而已。

然而一如 JQuery 的許多函式具有多數功能,click 亦擔任兩種不同的任務。
JO.click(function(){}); 當傳入 Callback 函式時,click 作為事件回呼的設定函式。
JO.click();             當 click 不傳任何參數時,當作觸發事件。

在此僅介紹 click 事件,JQuery 基本重新實作了大部分的 Javascript 事件,
大抵不脫離前述的使用方式。

==== live / die  &  delegate / undelegate ====

如同 bind 與 unbind 相對一般,live 與 die 相對;delegate 與 undelegate 相對。
基本上二種用法類似,功能都是為動態 Element 註冊事件。

試想以下情況:
網頁上提供使用者建立自己的通訊錄,建立一筆資料後,旁邊會提供一顆刪除按鈕。

上述情況,開發者無法預期使用者會建立多少筆資料,
但只要有一筆資料,就必須提供一個刪除該筆的功能按鈕。
為完成該刪除按鈕的事件,在每次產生一筆新資料時,
就必須同時執行一段程式碼,將刪除功能註冊給按鈕的 click 事件。
當資料有 100 筆時,頁面中就有 100 顆按鈕,以及 100 個 click 事件。

透過 live 方避免掉反覆註冊的手續,
在 1.4 版後推出的 delegate 更一舉將事件的註冊量大幅降低。

由於 delegate 的效能遠超過 live,因此只介紹 delegate 原理。
承前例,delegate 在網頁一開始就在這些通訊錄資料的上層 Element 註冊事件,
透過 JQuery 事件向上層傳遞的原理,
所有刪除按鈕的 click 事件最終會傳遞到上層 Element 負責觸發,
然後才由 delegate 中的 selector 參數去分析觸發事件的來源 Element,
因此即使有 100 顆按鈕,但實際上只有 1 個事件。

================================================================================
©2011-2022 RZ Fang 創用 CC 授權條款