邊做邊學 jQuery 系列 3-jQuery 常用的 Javascript 技巧
邊做邊學 jQuery 系列 3-jQuery 常用的 Javascript 技巧教學影片 > [!VIDEO https://www.microsoft.com/zh-tw/videoplayer/embed/589beaad-8d03-4df6-90ab-1f7bd278980d] |
要正式使用 jQuery 之前,我們先做些基本功課。
【jQuery 初步】
jQuery 架構的主要應用概念是"由 Selector 取得一個或多個元素組成的群組(Set),然後再串接我們要對群組裡各元素所做的各項動作"。舉例來說:
jQuery("div.clsEditor").hide();
jQuery("div.clsEditor")會傳回一個所謂的 jQuery 物件,"div.clsEditor"就是所謂的 Selector,可以對DOM裡的所有元素進行篩選,得到一個由所有 CSS 類別為 clsEditor 的 <div> 元素組成的群組,而之後所加上的 .hide() 即意味著對群組裡的每一個元素進行隱藏 (style.display="none")。jQuery 物件具備類似陣列的特性,我們可以透過 .length 得知群組內的元素個數,一樣可以用 [n] 存取第 n 個元素,get() 則會真的傳回由 HTML 元素所組成的陣列。在實際寫程式時,我們多半會用 "$" 符號代替 "jQuery" 幾個字,換句話說,jQuery("div.clsEditor") 可以寫成 $("div.clsEditor"),效果完全相同。
上面所提的 hide() 方法,是 jQuery 所延伸擴充的功能,並非原本 DOM 所內建的,因此元素要被包裝在 jQuery 物件中才能引用呼叫;當傳回結果是 jQuery 物件時,也別把它當成 DOM 元素操作,試圖設定 style.display、innerHTML 之類的元素屬性。這是初學 jQuery 容易混淆的地方,jQuery 小抄上有傳回資料型別提示,可以幫上一些忙。
除了用 Selector 選取,我們也可以直接提供 HTML 標籤當場創造元素,例如:
$("<span>New</span>").appendTo("body");
這樣就可以立即建立一個 <span> 並安插在網頁的最下方。至於要對已取得的元素上套用 jQuery 的各項函數,只需將元素傳入 $(...) 中即可,例如以下的例子:
$(document.body).css("margin", "0px");
最後提醒一點,所有對網頁內容的更動(例如: 新增元素),應該都要等待瀏覽器載入網頁完成後再進行,更動載入中的網頁結構可能導致錯誤或不可知的結果。因此,網頁初始化就要執行的程式碼,要放在 <body onload="..."> 的 onload 函數中才保險。在 jQuery 中,我們可以寫成
$(document).ready(function () {
//初始階段要做的事...
});
jQuery 的終極精神就是中就是要追求"write less, do more",所以 jQuery 提供了 jQuery(callback) 的語法,讓我們可將以上的程式碼再簡化成:
$(function() {
//初始階段要做的事...
});
補充一點,$()的快捷別名在一些AJAX Framework或Javascript中(例如: Prototype)也被用掉了(好像$在哪裡都很受歡迎:D)。透過jQuery.noConflict();函數,便可將$符號讓給其他Framework使用,算是考慮得十分周到。
由以上陸續出現的例子,我們大概可以體會到,jQuery在應用時,操作手法很一致,都是先取得要處置的對象,後面再逐一接上要進行的操作,要處置的對象可以是一個群組,而該操作也會一一套用在群組裡每個成員上。例如: $(".clsInput").css("color", "red").css("border", "solid 1px blue").val("Test") 就等於取得所有 CSS 類別為 clsInput 的元素,改變它們的顏色、再改變它們的框線、最後設定它們的 value 值,邏輯上很直覺易懂,加上函數可以一再串接,這樣的特性讓 jQuery 的程式碼極為精簡。
【Javascript 進階語法】
會想到要補充這些 Javsscript 進階語法是基於我自己的經驗,即便已搞過好幾年網站,也用 Javascript 寫過不少前端函數,但有些進階(而且好用)語法卻是在接觸 jQuery 後才慢慢學會的,這些技巧後來也很普遍地應用在其他寫 Javascript 程式的場合,大幅提高了我程式的簡潔度。而搞懂這些技巧,將有助於我們看懂 jQuery 的程式與範例。
以下介紹幾個補充重點:
1. 物件屬性操作
雖然嚴格來說,Javascript 不算是一種物件導向語言,但 Javascript 也可以產生類似的物件屬性 (Property)、方法 (Method) 效果。例如以下的示範:
function say(msg) {
alert(this.Name + " 說: " + msg);
}
var person = new Object();
person.Name = "Jeffrey";
person.Say = say;
//取得屬性
alert("Name=" + person.Name);
//呼叫方法
person.Say("Hello");
//透過名稱字串取得屬性
alert("Name=" + person["Name"]);
//透過名稱字串呼叫方法
person["Say"]("Hello");
2. 匿名函數 (Anonymous Function)
傳統上,大家已經很熟悉用 function funcName(args) { ... } 的方式宣告函數,再用函數名稱設定為某個元素的事件。但在 jQuery 中,為了精簡起見,針對只使用在一個特定地方的函數,常常會省略另外宣告函數名稱的步驟,而直接用 function(msg) { ... } 定義函數內容。例如: 前述例子中的 say(msg) 若只專屬給 person 使用,我們可以寫成:
var person = new Object();
person.Name = "Jeffrey";
person.Say = function(msg) {
alert(this.Name + " 說: " + msg);
};
person.Say("匿名函數呼叫成功!");
3. 匿名物件(Anonymous Object)
以上的寫法已經夠簡潔了嗎? 還不夠,更進一步,我們可以直接將 new Object() 的過程省略,直接寫成以下形式:
var person2 = {
Name: "Jeffrey",
Say: function(msg) { alert(this.Name + " 說: " + msg); }
};
person2.Say("匿名物件耶!");
4. 陣列表示法
傳統上,要建立一個陣列,我們會先 var ary = new Array(); 再 ary[0]="AAA"; ary[1]="BBB"; 逐一寫入值。其實Javascript有更簡潔的寫法,寫成 var ary = [ "AAA", "BBB", "CCC" ]; 即可!
jQuery 廣泛地使用了上述幾項技巧,尤其是要傳遞多個參數時,常用匿名物件來包裝多組數值。舉例來說,我們要變更某個 <span> 的 CSS,改為藍色、加上底線並修改游標使其像個連結,我們可以分別呼叫三次 css(),也可以將三個 CSS 屬性包成匿名物件再一次傳給 css(),結果相同。其中,直接宣告屬性名稱不可包含連字線,所以寫成 textDecoration: "underline",但也可以寫成 "text-decoration": "underline",效果相同。
$(function() {
$("span").css("color", "blue")
.css("text-decoration", "underline")
.css("cursor", "pointer");
//可改為以下寫法,更為簡潔
$("span").css({ color: "blue", textDecoration: "underline", cursor: "pointer" });
});
在 Visual jQuery 中,當參數型別有提到是 Key/Value Pairs 的地方,都可以使用上述技巧。
此外,在函數宣告上,jQuery 也大量使用匿名函數的寫法。例如: 當我們宣告事件或指定回應處理 (Callback) 時,若函數邏輯為專屬性質,無他處要共用,多半就直接寫成匿名函數,讓程式更簡短一些,同時也該相關邏輯更集中,較易閱讀。例如:
$("span").click(function() { alert("Clicked!"); });
最後,再補充一個技巧,有時我們會針對不同的條件呼叫不同的 jQuery 方法,例如條件成立時顯示、不成立時隱藏: if (a=="1") $("#boo").show(); else $("#boot").hide();。針對這種動態決定不同函數的需求,我們可以善用前述 "透過名稱字串呼叫方法" 的小技巧,改寫成 $("#boo")[(a=="1")?"show":"hide"]();。是不是更簡潔呢? (註: jQuery 從 1.3 版起,新增了toggle(true/false) 可達到前述依條件決定 show 或 hide 的功能)
經由以上的討論,我們不難體會 "力求簡潔" 正是 jQuery 的核心精神所在,而陸續介紹的語法特性裡,還會有更多精彩的簡潔化實例。
【範例檔案下載】