jQuery提供兩種方式來(lái)選擇html的elements,第一種是用CSS和Xpath選擇器聯(lián)合起來(lái)形成一個(gè)字符串來(lái)傳送到j(luò)Query的構(gòu)造器(如:$("div > ul a"));第二種是用jQuery對(duì)象的幾個(gè)methods(方法)。這兩種方式還可以聯(lián)合起來(lái)混合使用。
為了測(cè)試一下這些選擇器,我們來(lái)試著在我們starterkit.html中選擇并修改第一個(gè)ordered list.
一開始,我們需要選擇這個(gè)list本身,這個(gè)list有一個(gè)ID叫“orderedlist”,通常的javascript寫法是document.getElementById("orderedlist").在jQuery中,我們這樣做:
$(document).ready(function() { $("#orderedlist").addClass("red");});
這里將starterkit中的一個(gè)CSS樣式red附加到了orderedlist上(譯者Keel注:參考測(cè)試包中的css目錄下的core.css,其中定義了red樣式)。因此,在你刷新了starterkit.html后,你將會(huì)看到第一個(gè)有序列表(ordered list )背景色變成了紅色,而第二個(gè)有序列表沒有變化.
現(xiàn)在,讓我們添加一些新的樣式到list的子節(jié)點(diǎn).
$(document).ready(function() { $("#orderedlist > li").addClass("blue");});
這樣,所有orderedlist中的li都附加了樣式"blue"。
現(xiàn)在我們?cè)僮鰝€(gè)復(fù)雜一點(diǎn)的,當(dāng)把鼠標(biāo)放在li對(duì)象上面和移開時(shí)進(jìn)行樣式切換,但只在list的最后一個(gè)element上生效。
$(document).ready(function() { $("#orderedlist li:last").hover(function() { $(this).addClass("green"); }, function() { $(this).removeClass("green"); });});
還有大量的類似的CSS和XPath例子,更多的例子和列表可以在這里找到。(譯者Keel注:入門看此文,修行在個(gè)人,要想在入門之后懂更多,所以這段話的幾個(gè)鏈接遲早是要必看的!不會(huì)又要翻譯吧...^_^!)
每一個(gè)onXXX事件都有效,如onclick,onchange,onsubmit等,都有jQuery等價(jià)表示方法(譯者Keel注:jQuery不喜歡onXXX,所以都改成了XXX,去掉了on)。其他的一些事件,如ready和hover,也提供了相應(yīng)的方法。
你可以在Visual jQuery找到全部的事件列表,在Events欄目下.
用這些選擇器和事件你已經(jīng)可以做很多的事情了,但這里有一個(gè)更強(qiáng)的好東東!
$(document).ready(function() { $("#orderedlist").find("li").each(function(i) { $(this).html( $(this).html() + " BAM! " + i ); });});
find() 讓你在已經(jīng)選擇的element中作條件查找,因此 $("#orderedlist).find("li") 就像 $("#orderedlist li")一樣。each()方法迭代了所有的li,并可以在此基礎(chǔ)上作更多的處理。 大部分的方法,如addClass(), 都可以用它們自己的 each() 。在這個(gè)例子中, html()用來(lái)獲取每個(gè)li的html文本, 追加一些文字,并將之設(shè)置為li的html文本。(譯者Keel注:從這個(gè)例子可以看到.html()方法是獲取對(duì)象的html代碼,而.html('xxx')是設(shè)置'xxx'為對(duì)象的html代碼)
另一個(gè)經(jīng)常碰到的任務(wù)是在沒有被jQuery覆蓋的DOM元素上call一些方法,想像一個(gè)在你用AJAX方式成功提交后的reset:
$(document).ready(function() { // use this to reset a single form $("#reset").click(function() { $("form")[0].reset(); });});
(譯者Keel注:這里作者將form的id也寫成了form,源文件有<form id="form">,這是非常不好的寫法,你可以將這個(gè)ID改成form1或者testForm,然后用$("#form1")或者$("#testForm")來(lái)表示它,再進(jìn)行測(cè)試。)
上面這個(gè)代碼選擇了所有的"form"元素,并在其中的第一個(gè)上call了一個(gè)reset()。如果你有一個(gè)以上的form,你可以這樣做:
$(document).ready(function() { // use this to reset several forms at once $("#reset").click(function() { $("form").each(function() { this.reset(); }); });});
(譯者Keel注:請(qǐng)注意一定要親自將這些代碼寫在custom.js中并在starterkit.html上測(cè)試效果才能有所體會(huì)!必要時(shí)要觀察starterkit.html的html代碼)
這樣你在點(diǎn)擊Reset鏈接后,就選擇了文檔中所有的form元素,并對(duì)它們都執(zhí)行了一次reset()。
還有一個(gè)你可能要面對(duì)的問題是不希望某些特定的元素被選擇。jQuery 提供了filter() 和not() 方法來(lái)解決這個(gè)問題。 filter()以過(guò)濾表達(dá)式來(lái)減少不符合的被選擇項(xiàng), not()則用來(lái)取消所有符合過(guò)濾表達(dá)式的被選擇項(xiàng). 考慮一個(gè)無(wú)序的list,你想要選擇所有的沒有ul子元素的li元素。
$(document).ready(function() { $("li").not(":has(ul)").css("border", "1px solid black");//原文為$("li").not("[ul]").css("border", "1px solid black");});
這個(gè)代碼選擇了所有的li元素,然后去除了有ul子元素的li元素。刷新瀏覽器后,所有的li元素都有了一個(gè)邊框,只有ul子元素的那個(gè)li元素例外。
(譯者Keel注:請(qǐng)注意體會(huì)方便之極的css()方法,并再次提醒請(qǐng)務(wù)必實(shí)際測(cè)試觀察效果,比方說(shuō)換個(gè)CSS樣式呢?再加一個(gè)CSS樣式呢?像這樣:$("li").not("[ul]").css("border", "1px solid black").css("color","red");)
上面代碼中的[expression] 語(yǔ)法是從XPath而來(lái),可以在子元素和屬性(elements and attributes)上用作過(guò)濾器,比如你可能想選擇所有的帶有name屬性的鏈接:
$(document).ready(function() { $("a[name]").css("background-color","#eee"); //原文為“$("a[@name]").background("#eee");”在jQuery1.2及以上版本中,@符號(hào)應(yīng)該去除,background方法被css方法取代});
這個(gè)代碼給所有帶有name屬性的鏈接加了一個(gè)背景色。(譯者Keel注:這個(gè)顏色太不明顯了,建議寫成$("a[name]").css("background-color","#eee");) [注:在jQuery1.2及以上版本中,@符號(hào)應(yīng)該去除,下文中不再說(shuō)明]
更常見的情況是以name來(lái)選擇鏈接,你可能需要選擇一個(gè)有特點(diǎn)href屬性的鏈接,這在不同的瀏覽器下對(duì)href的理解可能會(huì)不一致,所以我們的部分匹配("*=")的方式來(lái)代替完全匹配("="):
$(document).ready(function() { $("a[href*=/content/gallery]").click(function() { // do something with all links that point somewhere to /content/gallery });});
到現(xiàn)在為止,選擇器都用來(lái)選擇子元素或者是過(guò)濾元素。另外還有一種情況是選擇上一個(gè)或者下一個(gè)元素,比如一個(gè)FAQ的頁(yè)面,答案首先會(huì)隱藏,當(dāng)問題點(diǎn)擊時(shí),答案顯示出來(lái),jQuery代碼如下:
$(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(); } });});
這里我們用了一些鏈?zhǔn)奖磉_(dá)法來(lái)減少代碼量,而且看上去更直觀更容易理解。像'#faq' 只選擇了一次,利用end()方法,第一次find()方法會(huì)結(jié)束(undone),所以我們可以接著在后面繼續(xù)find('dt'),而不需要再寫$('#faq').find('dt')。
在點(diǎn)擊事件中的,我們用 $(this).next() 來(lái)找到dt下面緊接的一個(gè)dd元素,這讓我們可以快速地選擇在被點(diǎn)擊問題下面的答案。
(譯者Keel注:這個(gè)例子真是太酷了,F(xiàn)AQ中的答案可以收縮!從利用next()的思路到實(shí)現(xiàn)這些效果都有很多地方需要我們消化,注意 if (answer.is(':visible'))用法,注意answer.slideUp();不懂的地方趕緊查我在最開始提到的兩個(gè)必看API文檔)
除了選擇同級(jí)別的元素外,你也可以選擇父級(jí)的元素。可能你想在用戶鼠標(biāo)移到文章某段的某個(gè)鏈接時(shí),它的父級(jí)元素--也就是文章的這一段突出顯示,試試這個(gè):
$(document).ready(function() { $("a").hover(function() { $(this).parents("p").addClass("highlight"); }, function() { $(this).parents("p").removeClass("highlight"); });});
測(cè)試效果可以看到,移到文章某段的鏈接時(shí),它所在的段全用上highlight樣式,移走之后又恢復(fù)原樣。
(譯者Keel注:highlight是core.css中定義的樣式,你也可以改變它,注意這里有第二個(gè)function()這是hover方法的特點(diǎn),請(qǐng)?jiān)贏PI文檔中查閱hover,上面也有例子說(shuō)明)在我們繼續(xù)之前我們先來(lái)看看這一步: jQuery會(huì)讓代碼變得更短從而更容易理解和維護(hù),下面是$(document).ready(callback)的縮寫法:
$(function() { // code to execute when the DOM is ready});
應(yīng)用到我們的Hello world例子中,可以這樣:
$(function() { $("a").click(function() { alert("Hello world!"); });});
現(xiàn)在,我們手上有了這些基礎(chǔ)的知識(shí),我們可以更進(jìn)一步的探索其它方面的東西,就從AJAX開始!
聯(lián)系客服