2007年5月9日 星期三

jQuery入門第一步

指南(1)用jquery開始吧

這個指南是對jquery庫的一個總的介紹,當然你也被要求具備javascript和DOM(文檔對象模型)的相關知識。該指南試圖解釋一些必須的細節。它涵蓋了一個簡單的」hello world」實例,選擇器和事件基礎,AJAX,FX以及官方插件。

這個指南並沒有」click me」,而是依靠」copy me」(複製/粘貼代碼)來測試例子,拷貝一個例子,看它是怎麼做的,然後根據你自己的想法修改它。

目錄:
1. 安裝
2. Hello jQuery (look like hello world)
3. 用選擇器(selector)和事件(events)
4. 用ajax
5. 用FX(各種效果)
6. 用tablesorter 插件
7. 書寫你自己的插件
8. 下一步(展望)


1.安裝
開始之前,我們需要一個jquery庫的拷貝(js文件)。最新的版本你能在這裡下載。這個指南也提供了一個基本的「開始工具包」,你可以在下面地址下載到。

Jquery starterkit

下載該文件並且解壓縮。用你喜歡的編輯器(比如:記事本)打開starterkit.htm和custom.js,並在瀏覽器(IE,firefox, netscape)打開starterkit.htm
現在我們可以開始類似於「hello world」的例子了。

2.Hello ,jQuery
作為我們要做的每一件事情,需要確定只要用到了dom,那麼你就應該為當前文檔註冊一個ready 事件
(關於ready和onload的區別,大家可以參考<小蛀翻譯的"jQuery簡單指南"部分>,在這裡就不解釋了)

$(document).ready(function() {
// do stuff when DOM is ready
});



在函數塊裡邊放一個alert並沒多少意義,因為一個alert並不需要DOM被加載。所以你可以做一些更複雜的事情來用到dom,比如下面當你click一個的時候顯示一個alert
$(document).ready(function() {
$("a").click(function() {
alert("Hello world!");
});
});



所以只要你點
標籤,alert就會顯示出來。
讓我們看一看都做了些什麼吧。$(「a」)是一個jquery的選擇器(selector),它能選擇所有的元素(dom對象)。$是一個jquery裡對於類的別名,因此$()構造了一個新的jquery對象。Click()函數是對象裡的有個方法。它綁定了對所有元素的click事件並且當事件發生時執行提供的函數。
類似於下面的代碼:
Link
這個區別是顯而易見的:我們不需要為單一的對象寫click事件了。我們把html(結構)和js(行為)分開了就像用CSS分開一樣。
現在,我們已經對選擇器和事件有了一定的認識了。

3.選擇器(selector)和事件(events)
Jquery提供了2個方法來選擇DOM元素。第一個方法是用CSS和XPATH(比如:$(「div > ul a」))。第二種方法是用jQuery對象的各種方法。當然兩種方法也可以結合。
我們在starterkit裡選擇和修改第一個order list來測試這些選擇器。
開始之前,我們需要選擇列表本身。這個列表有一個ID=」 orderedlist」,在經典javascript裡,你必須這樣用:document.getElementById("orderedlist"),但是在jQuery裡,我們只需要做這些:
$(document).ready(function() {
$("#orderedlist").addClass("red");
});



這個starterkit提供了一個如何加CSS樣式 class.red。因此,當你刷新starterkit.htm的時候,你會發現第一個list背景變成紅色,而第二個list沒有被改變。
現在讓我們加更多的classes到list的子元素:
$(document).ready(function() {
$("#orderedlist > li").addClass("blue");
});



上面的例子選擇了id為orderedlist的所有子標籤li,並且在他們上面加了一個class.blue的樣式。
現在來點更複雜的。當鼠標移到li元素的時候,增加和刪除一個Class樣式:
$(document).ready(function() {
$("#orderedlist li:last").hover(function() {
$(this).addClass("green");
}, function() {
$(this).removeClass("green");
});



你在這裡可以找到很多CSS和XPATH的語法。
更多的例子和表達式你也可以在這裡找到。
對於每個onxxx事件,象onclick,onchange,onsubmit等,都有一個和jquery同意義的對應的事件,而其他事件,象ready,hover等,都是為某個方法提供。
你能在visual jquery裡發現一個完整的事件列表。

還有種寫法是jquery特有的(chain),就是把一個選擇器的所有的事件並排列出來,中間用」.」隔開:
$(document).ready(function() {
$("#orderedlist").find("li").each(function(i) {
$(this).html( $(this).html() + " BAM! " + i );
});
});



一個你經常面對的任務是在事件裡邊執行函數。比如這樣
$(document).ready(function() {
// use this to reset a single form
$("#reset").click(function() {
$("#form")[0].reset();
});
});



這個代碼只是ID為form的表單執行reset()方法。但是萬一你有很多個表單需要執行呢?那麼你可以這樣寫:
$(document).ready(function() {
// use this to reset several forms at once
$("#reset").click(function() {
$("form").each(function() {
this.reset();
});
});
});



另外一個你必須面對的問題是選擇某個或某幾個元素。Jquery提供了filter()和not()方法。當filter()是過濾一些適合filter ()表達式元素,而not()是刪除和not()表達式相反的元素。當你想選擇所有的li元素,並且不包含ul子元素呢?你可以這樣寫:
$(document).ready(function() {
$("li").not("[ul]").css("border", "1px solid black");
});



結果是除了包含ul子元素的li,其他所有的li都得到了一個border.可能你也想選擇有name屬性的anchor():
$(document).ready(function() {
$("a[@name]").background("#eee");
});



要匹配屬性的值(value),我們可以用」*=」來代替」=」
$(document).ready(function() {
$("a[@href*=/content/gallery]").click(function() {
// do something with all links that point somewhere to /content/gallery
});
});



直到現在,我們已經學到了很多選擇器的使用。這裡還有種情況你需要選擇前一個或後一個元素。想一想starterkit.htm裡的FAQ,當你click問題的時候,它是怎麼實現隱藏和顯示的呢?代碼是這樣的:
$(document).ready(function() {
$('#faq').find('dd').hide().end().find('dt').click(function() {
var answer = $(this).next();
if (answer.is(':visible')) {
answer.slideUp();
} else {
answer.slideDown();
}
});
});



因為上面只有唯一一個選擇器(#faq),我們用chain來減少代碼的長度和提高代碼的易讀性和表現性.這裡要說明一下,如果按原文翻譯過來我想很多人都看不懂,感覺他自己也沒怎麼說明白。我說說我自己的理解:
『dd'和『dt'都是#faq的子元素,find()的作用就是找到它的子元素。End()應該和next()搭配的,end()實質上是把『dd'過濾了,也就是next()的時候實質上是參考的』dt'。這樣每個』dt'的next就是『dd',挺容易實現的。要是還不明白你可以邊參考邊照著做一遍。

除了同屬元素外,我們也可以選擇父元素:
$(document).ready(function() {
$("a").hover(function() {
$(this).parents("p").addClass("highlight");
}, function() {
$(this).parents("p").removeClass("highlight");
});
});


很容易看懂,p就是a的父元素。

讓我們回顧一下前面所學的,jquery有很多地方能使代碼更簡潔因此容易讀和保持。下面的就是對$(document).ready(callback)符號的一個簡單描述
$(function() {
// code to execute when the DOM is ready
});




好吧,讓我們來寫個hello , world ,來結束第一天的課程,相信你一定會寫了吧
$(function() {
$("a").click(function() {
alert("Hello world!");
});
});



現在,基礎已經掌握了,下次我們將探索一下Jquery的其他方面(ajax)

4.Rateing:使用AJAX
在這部分我們寫了一個簡單的ajax應用,它的目的是允許用戶rate(評估)一些事情,就像youtube.com一樣.
我們需要寫一些代碼.例子中用到了一個php文件來讀取"rating"的參數和返回rating個數(count)和平均rating(array_sum/count).你可以看一看starterkit裡邊的rate.php代碼.
我們需要這個例子工作在ajax上,因此我們用jquery寫一個必要的標籤並且把它追加到一個ID名為」rating」的div容器裡邊.代碼如下:
$(document).ready(function() {
// generate markup
var ratingMarkup = ["Please rate: "];
for(var i=1; i <= 5; i++) { ratingMarkup[ratingMarkup.length] = "
" + i + " ";
}
// add markup to container and applier click handlers to anchors
$("#rating").append( ratingMarkup.join('') ).find("a").click(function(e) {
e.preventDefault();
// send requests
$.post("rate.php", {rating: $(this).html()}, function(xml) {
// format result
var result = [
"Thanks for rating, current average: ",
$("average", xml).text(),
", number of votes: ",
$("count", xml).text()
];
// output result
$("#rating").html(result.join(''));
} );
});
});


上面的代碼片斷產生了5個元素並且把它們追加到了id為」rating」的div容器裡.第一次加載頁面後,所有的 元素都包含在div容器裡,然後再加上個click事件。當被click的時候,一個post請求被發送到rate.php文件裡,並且通過rating: $(this).html()傳遞參數,經過處理PHP文件處理後把結果作為xml寫進div容器

如果你電腦上沒裝php的運行環境。你可以在這裡看到這個例子的效果。

對與一個不用javascript也能工作的rating例子,你可以訪問softonic.de

你也能在這裡或者在visual jquery裡邊發現更多的關於ajax的幫助文檔。

當靠AJAX加載內容的時候,一個非常普遍的問題是:當加載事件句柄到你文檔的時候也需要將該事件應用與你加載的內容裡,所以你不得不在內容加載之後提供這些事件句柄。為了防止代碼重複,你應該委派一個函數。例如:
// lets use the shortcut
$(function() {
var addClickHandlers = function() {
$("a.clickMeToLoadContent").click(function() {
$("#target").load(this.href, addClickHandlers);
});
};
addClickHandlers();
});



上面當DOM準備好後addClickHandlers只應用了一次,並且每次用戶點一個樣式為class. clickMeToLoadContent的時候內容已經完成加載了。
請主義函數addClickHandlers被定義成了一個局部變量,而非全局函數(function addClickHandlers() {...}).。請堅持這種寫法,因為它可以避免全局變量定義過多引起的衝突。

另外一個非常普遍的AJAX回調問題是參數。假設你需要傳遞一個額外的參數,那麼把回調封裝到一個函數里能夠實現,如下:
// get some data
var foobar = ...;
// specify handler, it needs data as a paramter
var handler = function(data) {
...
};
// add click handler and pass foobar!
$('a').click( function(event) { handler(foobar); } );

// if you need the context of the original handler, use apply:
$('a').click( function(event) { handler.apply(this, [foobar]); });



5.各種動態效果的實現:用FX
Jquery能實現簡單的動態效果,比如顯示(show)和隱藏(hide)
// $(document).ready(function() {
$("a").toggle(function() {
$(".stuff").hide('slow');
}, function() {
$(".stuff").show('fast');
});
});



發揮你的想像,你能用aninate()創建任意的組合:
// $(document).ready(function() {
$("a").toggle(function() {
$(".stuff").animate({
height: 'hide',
opacity: 'hide'
}, 'slow');
}, function() {
$(".stuff").animate({
height: 'show',
opacity: 'show'
}, 'slow');
});
});



在interface 插件收集裡,你能發現很多奇特的效果。這個站點也提供一些演示。

6.分類:用表格分類插件
該插件是運行在客戶端的,所以你只要在你文件裡包含jquery和插件的文件並且寫出你想如何分類。試試下面的例子。在starterkit.htm裡添加下面一行代碼:



把插件包含進去後,你還需要在custom.js裡寫
$(document).ready(function() {
$("#large").tableSorter();
});



點擊表格的頭部看看它是怎麼工作的。
這個表格也能夠用高亮隔行顯示來實現斑馬線效果。代碼如下:
$(document).ready(function() {
$("#large").tableSorter({
stripingRowClass: ['odd','even'], // Class names for striping supplyed as a array.
stripRowsOnStartUp: true // Strip rows on tableSorter init.
});
});



這裡有更多的例子和演示在tablesorter homepage
當你用jquery久了之後會發現把你的代碼(功能模塊)作為插件封裝在一個包是多麼有用,不僅你自己或你的公司能重用這些代碼(功能模塊),也能在一些社區裡共享。下面我們將來看看如何構造一個插件!

7.插件:寫你自己的jquery插件
其實為jquery寫插件是很簡單的。如果你按照下面的規則,整合你的插件將非常容易。
1.給你的插件命名。讓我們叫它」foobar」
2.創建一個文件名為:jquery.[你的插件名].js 比如:jquery.foobar.js
3.擴展jquery的內部對象,創建一個或多個插件的方法,比如:
jQuery.fn.foobar = function() {
// do something
});


4.用幫助函數創建一個對象(可選)
jQuery.fooBar = {
height: 5,
calculateBar = function() { ... },
checkDependencies = function() { ... }
};


然後你能在你的插件裡邊調用這些幫助函數
jQuery.fn.foobar = function() {
// do something
jQuery.foobar.checkDependencies(value);
// do something else
};


5.創建一個用戶能修改的默認的設置(可選)
jQuery.fn.foobar = function(options) {
var settings = {
value: 5,
name: "pete",
bar: 655
};
if(options) {
jQuery.extend(settings, options);
}
};


然後你能用下面的默認調用該插件(有選項)
$("...").foobar({
value: 123,
bar: 9
});



如果你要發佈你的插件,你應該提供一些例子和演示。
現在你有一個基本的認識了吧,讓我們運用自己的知識和創造力來寫我們自己的插件
有很多朋友操作表單這樣來結束代碼:
$("input[@type='checkbox']").each(function() {
this.checked = true;
// or, to uncheck
this.checked = false;
// or, to toggle
this.checked = !this.checked;
});


請注意,無論什麼時候,當你的代碼出現each時,你應該重寫上面的代碼來構造一個插件如下:
$.fn.check = function() {
return this.each(function() {
this.checked = true;
});
};


於是插件可以這樣用:
$("input[@type='checkbox']").check();



現在你也能寫一些插件為uncheck()和togglecheck().但是我們可以擴展插件來接收一些選項.
$.fn.check = function(mode) {
var mode = mode || 'on'; // if mode is undefined, use 'on' as default
return this.each(function() {
switch(mode) {
case 'on':
this.checked = true;
break;
case 'off':
this.checked = false;
break;
case 'toggle':
this.checked = !this.checked;
break;
}
});
};


然後用戶能夠這麼使用:
$("input[@type='checkbox']").check();
$("input[@type='checkbox']").check('on');
$("input[@type='checkbox']").check('off');
$("input[@type='checkbox']").check('toggle');



8.下一步(展望)
如果你計劃學習更多的javascript,你應該考慮用firefox的firebug插件來調試你的代碼.它為javascript的調試提供了一個控制台,一個調試器和其他有用的東西.

【下列文章您可能也有興趣】

沒有留言: