jQuery 選擇器 (Selectors)
選擇器是 jQuery 的核心功能,讓你能夠輕鬆地選取 DOM 元素。jQuery 選擇器語法與 CSS 選擇器幾乎相同,如果你熟悉 CSS,學習 jQuery 選擇器會非常快速。
基本選擇器
元素選擇器
選取所有指定的 HTML 標籤元素:
$('p'); // 所有 <p> 元素
$('div'); // 所有 <div> 元素
$('input'); // 所有 <input> 元素
ID 選擇器
選取特定 ID 的元素(ID 在頁面中應該是唯一的):
$('#header'); // id="header" 的元素
$('#main-nav'); // id="main-nav" 的元素
ID 選擇器是最快的選擇器,因為它直接對應到
document.getElementById()。Class 選擇器
選取所有具有指定 class 的元素:
$('.active'); // 所有 class="active" 的元素
$('.btn'); // 所有 class="btn" 的元素
$('.error.show'); // 同時具有 error 和 show 兩個 class 的元素
萬用選擇器
選取所有元素:
$('*'); // 頁面中所有元素
$('#container *'); // #container 內的所有元素
注意:萬用選擇器效能較差,應避免在大型頁面中單獨使用。
群組選擇器
同時選取多種元素:
$('h1, h2, h3'); // 所有 h1、h2、h3 元素
$('.btn, .link, #submit'); // 多種選擇器組合
階層選擇器
後代選擇器
選取某元素內部所有符合條件的後代元素:
$('div p'); // div 內的所有 p 元素(包含巢狀)
$('#content a'); // #content 內的所有連結
$('ul li'); // ul 內的所有 li 元素
子元素選擇器
只選取直接子元素,不包含更深層的後代:
$('ul > li'); // ul 的直接子 li 元素
$('#nav > .menu-item'); // #nav 的直接子元素中 class 為 menu-item 的
相鄰兄弟選擇器
選取緊接在某元素後面的兄弟元素:
$('h1 + p'); // 緊接在 h1 後面的 p 元素
$('.title + .content'); // 緊接在 .title 後面的 .content
一般兄弟選擇器
選取某元素後面所有符合條件的兄弟元素:
$('h1 ~ p'); // h1 後面所有的 p 兄弟元素
屬性選擇器
根據元素的屬性來選取:
// 具有某屬性
$('[href]'); // 所有具有 href 屬性的元素
$('[data-id]'); // 所有具有 data-id 屬性的元素
// 屬性等於特定值
$('[type="text"]'); // type 屬性等於 "text"
$('[name="email"]'); // name 屬性等於 "email"
// 屬性開頭匹配
$('[href^="https"]'); // href 以 "https" 開頭
$('[class^="btn-"]'); // class 以 "btn-" 開頭
// 屬性結尾匹配
$('[href$=".pdf"]'); // href 以 ".pdf" 結尾
$('[src$=".jpg"]'); // src 以 ".jpg" 結尾
// 屬性包含匹配
$('[href*="google"]'); // href 包含 "google"
$('[class*="active"]'); // class 包含 "active"
// 屬性不等於
$('[type!="submit"]'); // type 不等於 "submit"(jQuery 擴充)
// 組合多個屬性條件
$('input[type="text"][name="username"]');
過濾選擇器
jQuery 提供許多方便的過濾選擇器:
位置過濾
$('li:first'); // 第一個 li 元素
$('li:last'); // 最後一個 li 元素
$('tr:even'); // 偶數列(索引 0, 2, 4...)
$('tr:odd'); // 奇數列(索引 1, 3, 5...)
$('li:eq(2)'); // 第三個 li(索引從 0 開始)
$('li:gt(2)'); // 索引大於 2 的 li
$('li:lt(2)'); // 索引小於 2 的 li
:first、:last、:eq() 等是 jQuery 專有的選擇器。如需使用 CSS 標準選擇器,請使用 :first-child、:last-child、:nth-child() 等。CSS 標準位置選擇器
$('li:first-child'); // 父元素的第一個 li 子元素
$('li:last-child'); // 父元素的最後一個 li 子元素
$('li:nth-child(3)'); // 父元素的第 3 個 li(從 1 開始)
$('li:nth-child(odd)'); // 奇數位置的 li
$('li:nth-child(even)'); // 偶數位置的 li
$('li:nth-child(3n)'); // 每 3 個 li
$('li:only-child'); // 唯一子元素的 li
:first vs :first-child 的差異
<ul>
<li>項目 1</li>
<li>項目 2</li>
</ul>
<ul>
<li>項目 A</li>
<li>項目 B</li>
</ul>
$('li:first'); // 只選取「項目 1」(整個文件第一個 li)
$('li:first-child'); // 選取「項目 1」和「項目 A」(各自父元素的第一個 li)
內容過濾
$('div:contains("Hello")'); // 內容包含 "Hello" 的 div
$('td:empty'); // 沒有任何內容的 td
$('td:parent'); // 有內容的 td(與 :empty 相反)
$('div:has(p)'); // 包含 p 元素的 div
可見性過濾
$('div:visible'); // 可見的 div
$('div:hidden'); // 隱藏的 div
隱藏的元素包括:
display: nonetype="hidden"的 input- 寬高為 0 的元素
- 隱藏的祖先元素的後代
否定過濾
$('input:not(:checked)'); // 未勾選的 input
$('li:not(.active)'); // 沒有 active class 的 li
$('p:not(:first)'); // 除了第一個以外的 p
表單選擇器
jQuery 提供方便的表單相關選擇器:
表單元素類型
$(':input'); // 所有表單元素(input, textarea, select, button)
$(':text'); // type="text" 的 input
$(':password'); // type="password" 的 input
$(':checkbox'); // type="checkbox" 的 input
$(':radio'); // type="radio" 的 input
$(':submit'); // type="submit" 的 input 或 button
$(':reset'); // type="reset" 的 input
$(':button'); // type="button" 的 input 或 button 元素
$(':file'); // type="file" 的 input
$(':image'); // type="image" 的 input
表單狀態
$(':enabled'); // 可用的表單元素
$(':disabled'); // 停用的表單元素
$(':checked'); // 已勾選的 checkbox 或 radio
$(':selected'); // 已選取的 option
$(':focus'); // 目前獲得焦點的元素
範例:取得所有已勾選的 checkbox 值
$(':checkbox:checked').each(function () {
console.log($(this).val());
});
選擇器效能建議
優先使用 ID 選擇器
// 好 $('#content'); // 避免 $('div#content');縮小搜尋範圍
// 好 - 在特定範圍內搜尋 $('#content').find('.item'); // 或 $('.item', '#content'); // 較慢 - 搜尋整個文件 $('#content .item');快取選擇結果
// 好 - 快取 jQuery 物件 var $items = $('.item'); $items.addClass('active'); $items.show(); // 避免 - 重複選取 $('.item').addClass('active'); $('.item').show();避免過度使用萬用選擇器
// 避免 $('*'); $('.container > *');使用原生選擇器
// 較快 - CSS 標準選擇器 $('div.active'); // 較慢 - jQuery 專有選擇器 $('div:has(.active)');
小結
- jQuery 選擇器語法與 CSS 選擇器相容
- ID 選擇器 (
#id) 效能最佳 - 階層選擇器可以精確定位元素
- 屬性選擇器支援多種匹配模式
- 過濾選擇器可以進一步篩選元素
- 表單選擇器讓表單操作更方便
- 注意選擇器效能,善用快取