選擇器是jQuery的核心。一個選擇器寫出來類似$('#dom-id')
。
為什麼jQuery要發明選擇器?回顧一下DOM操作中我們經常使用的代碼:
// 按ID查找: var a = document.getElementById('dom-id'); // 按tag查找: var divs = document.getElementsByTagNames('div'); // 查找<p class="red">: var ps = document.getElementsByTagNames('p'); // 過濾出class="red": // TODO: // 查找<table class="green">裡面的所有<tr>: var table = ... for (var i=0; i<table.children; i++) { // TODO: 過濾出<tr> }
這些代碼實在太繁瑣了,並且,在層級關系中,例如,查找<table class="green">裡面的所有<tr>,一層循環實際上是錯的,因為<table>的標准寫法是:
<table> <tbody> <tr>...</tr> <tr>...</tr> </tbody> </table>
很多時候,需要遞歸查找所有子節點。
jQuery的選擇器就是幫助我們快速定位到一個或多個DOM節點。
按ID查找
如果某個DOM節點有id屬性,利用jQuery查找如下:
// 查找<div id="abc">: var div = $('#abc');
注意,#abc以#開頭。返回的對象是jQuery對象。
什麼是jQuery對象?jQuery對象類似數組,它的每個元素都是一個引用了DOM節點的對象。
以上面的查找為例,如果id為abc的<div>存在,返回的jQuery對象如下:
[<div id="abc">...</div>]
如果id為abc的<div>不存在,返回的jQuery對象如下:
[]
總之jQuery的選擇器不會返回undefined或者null,這樣的好處是你不必在下一行判斷if (div === undefined)。
jQuery對象和DOM對象之間可以互相轉化:
var div = $('#abc'); // jQuery對象 var divDom = div.get(0); // 假設存在div,獲取第1個DOM元素 var another = $(divDom); // 重新把DOM包裝為jQuery對象
通常情況下你不需要獲取DOM對象,直接使用jQuery對象更加方便。如果你拿到了一個DOM對象,那可以簡單地調用$(aDomObject)
把它變成jQuery對象,這樣就可以方便地使用jQuery的API了。
按tag查找
按tag查找只需要寫上tag名稱就可以了:
var ps = $('p'); // 返回所有<p>節點 ps.length; // 數一數頁面有多少個<p>節點
按class查找
按class查找注意在class名稱前加一個.:
var a = $('.red'); // 所有節點包含`class="red"`都將返回 // 例如: // <div class="red">...</div> // <p class="green red">...</p>
通常很多節點有多個class,我們可以查找同時包含red和green的節點:
var a = $('.red.green'); // 注意沒有空格! // 符合條件的節點: // <div class="red green">...</div> // <div class="blue green red">...</div>
按屬性查找
一個DOM節點除了id和class外還可以有很多屬性,很多時候按屬性查找會非常方便,比如在一個表單中按屬性來查找:
var email = $('[name=email]'); // 找出<??? name="email"> var passwordInput = $('[type=password]'); // 找出<??? type="password"> var a = $('[items="A B"]'); // 找出<??? items="A B">
當屬性的值包含空格等特殊字符時,需要用雙引號括起來。
按屬性查找還可以使用前綴查找或者後綴查找:
var icons = $('[name^=icon]'); // 找出所有name屬性值以icon開頭的DOM // 例如: name="icon-1", name="icon-2" var names = $('[name$=with]'); // 找出所有name屬性值以with結尾的DOM // 例如: name="startswith", name="endswith" 這個方法尤其適合通過class屬性查找,且不受class包含多個名稱的影響: var icons = $('[class^="icon-"]'); // 找出所有class包含至少一個以`icon-`開頭的DOM // 例如: class="icon-clock", class="abc icon-home"
組合查找
組合查找就是把上述簡單選擇器組合起來使用。如果我們查找$('[name=email]'),很可能把表單外的<div name="email">也找出來,但我們只希望查找<input>,就可以這麼寫:
var emailInput = $('input[name=email]'); // 不會找出<div name="email">
同樣的,根據tag和class來組合查找也很常見:
var tr = $('tr.red'); // 找出<tr class="red ...">...</tr>
多項選擇器
多項選擇器就是把多個選擇器用,組合起來一塊選:
$('p,div'); // 把<p>和<div>都選出來 $('p.red,p.green'); // 把<p class="red">和<p class="green">都選出來
要注意的是,選出來的元素是按照它們在HTML中出現的順序排列的,而且不會有重復元素。例如,<p class="red green">不會被上面的$('p.red,p.green')選擇兩次。