jQuery階層選擇器簡介
當我們所要選擇的元素,含有一定的階層關係時,就非常合適使用階層選擇器,例如,<ol>與<li>元素,<ol>一定是<li>父層,<li>一定是<ol>的子層,<li>與<li>之間是平輩關係。又例如,假設我們發表文章,文章是包含在一個<div>元素裡,此<div>元素的id名稱為Post,我想要針對此<div>元素的每一段落(p元素)進行CSS調整,因為我不知道文章本文會有多少段落,如果要使用基礎選擇器,將難以撰寫!DOM本身就是非常結構化、階層化,利用階層選擇器,我們可以很簡單使用如$('div.Post p')或$('div.Post > p')來選擇特定區域裡或符合我特定階層條件的元素來進行相關處理。jQuery階層選擇器速查表
| 選擇器 | 說明 | 範例 |
|---|---|---|
| parent > child | 重點在">"符號。父子階層,上下兩層關係,一個父能有多個子。回傳多個子元素,只包含第一層。 | $('ul.topnav > li') |
| ancestor descendant | 重點在兩選擇器之間的"空格"。祖孫階層,上下多層關係,一個祖能有多個孫(孫、曾孫、太孫…),且孫不限多少層。回傳多個孫元素(descendant)。 | $("form input") |
| prev + next | 重點在"+"符號。前後階層,前後兩層關係,似類排隊,一前一後的關係,記得"+"是"緊接著"下一個。回傳符合next元素。 | $("label + input") |
| prev ~ siblings | 重點在"~"符號。兄弟階層,平輩、同輩階層關係,左右關係,記得"~"像"水平"、"平行線"。回傳多個兄弟元素(siblings)。 | $("#prev ~ div") |
這裡介紹的四個階層選擇器">"、"空格"、"+"、"~",都是重要的基礎選擇器延伸應用,必須了解清楚。在使用階層選擇器時,要小心考慮進入點,我們通常要想要進入點之後的元素,一個清楚的進入點,可以讓程式運作上更有效率。
jQuery階層選擇器範例
parent > child選擇器範例:選擇所有<ul class="topnav">的li子元素。
這個">"選擇器在CSS中能被Safari、Firefox、Opera、Chrome、Internet Explorer 7以上Browser支援,Internet Explorer 6不支援。然而在jQuery中能支援所有Broswer,包含Internet Explorer 6。
<!DOCTYPE html>
<html>
<head>
<style>
body { font-size:14px; }
</style>
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
<ul class="topnav">
<li>Item 1</li>
<li>Item 2
<ul><li>Nested item 1</li><li>Nested item 2</li><li>Nested item 3</li></ul>
</li>
<li>Item 3</li>
</ul>
<script>
// 1. 選擇ul元素且類別名稱為topnav下的所有li子元素
$("ul.topnav > li").css("border", "3px double red");</script>
</body>
</html>
Item 2裡的ul與li就無border效果,因為它不是子元素。
ancestor descendant選擇器範例:從祖元素取得所有孫元素。
<!DOCTYPE html>
<html>
<head>
<style>
body { font-size:14px; }
form { border:2px green solid; padding:2px; margin:0;
background:#efe; }
div { color:red; }
fieldset { margin:1px; padding:3px; }
</style>
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
<form>
<div>Form is surrounded by the green outline</div>
<label>Child:</label>
<input name="name" />
<fieldset>
<label>Grandchild:</label>
<input name="newsletter" />
</fieldset>
</form>
Sibling to form: <input name="none" />
<script>
// form表單裡的任何input元素
$("form input").css("border", "2px dotted blue");</script>
</body>
</html>
最後一個input元素,因為不是form元素裡的元素,並不會有效果。
prev + next選擇器範例:選擇取接著在label之後的input元素。
<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
<form>
<label>Name:</label>
<input name="name" />
<fieldset>
<label>Newsletter:</label>
<input name="newsletter" />
</fieldset>
</form>
<input name="none" />
<script>
// 選擇緊接著在label之後的input元素
$("label + input").css("color", "blue").val("Labeled!")</script>
</body>
</html>
只要是緊接著label之後的input元素,都會被選擇。最後一個input不會被選擇。
prev ~ siblings選擇器範例:選擇id名稱為prev之後的所有div兄弟元素
$('prev + next')與$('prev ~ sibling')之間最值得注意的不同點是他們選擇範圍。$('prev + next')選擇緊接著的下一個同一層元素,$('prev ~ sibling')選擇緊接著的所有同一層兄弟元素。
<!DOCTYPE html>
<html>
<head>
<style>
div,span {
display:block;
width:80px;
height:80px;
margin:5px;
background:#bbffaa;
float:left;
font-size:14px;
}
div#small {
width:60px;
height:25px;
font-size:12px;
background:#fab;
}
</style>
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
<div>div (doesn't match since before #prev)</div>
<span id="prev">span#prev</span>
<div>div sibling</div>
<div>div sibling <div id="small">div niece</div></div>
<span>span sibling (not div)</span>
<div>div sibling</div>
<script>
// 1. 選擇id名稱為prev之後的所有div兄弟元素
$("#prev ~ div").css("border", "3px groove blue");</script>
</body>
</html>
<span id="prev">元素之後的兄弟div有三個。
這裡請多注意CSS裡的div#small樣式,jQuery的選擇器都是延伸自CSS選擇器,所以你在jQuery學到的選擇器知識或CSS學到的選擇器知識,基本上是可以互通使用的,唯CSS要小心與Internet Explorer相關相容性問題,jQuery本身會處理Broser相容性問題,可放心大膽使用。
jQuery階層選擇器修改歷程
[2011/12/14] 參考 jQuery 1.7 文件翻譯編寫。- Hierarchy Parent > child
- Hierarchy ancestor descendant
- Hierarchy prev + next
- Hierarchy prev ~ siblings
hi
回覆刪除請問這句有打錯嗎:最後一個input不會「放」選擇。
已修正。^_^
刪除