1. 程式人生 > >WEB前端 -- 屬性選擇器與層次選擇器

WEB前端 -- 屬性選擇器與層次選擇器

1.層次選擇器

層次選擇器
選擇器CSS模式JQuery模式描述
後代選擇器ul li a{}$('ul li a')獲取追溯到的多個DOM物件
子選擇器div > p{}$('div p')只獲取子類節點的多個DOM物件
next選擇器div + p{}$('div + p')只獲取某個節點後一個同級DOM物件
nextAll選擇器div ~p{}$('div ~ p')獲取某節點後面所有同級DOM物件

在層次選擇器中,除後代選擇器外,其他三種高階選擇器不支援IE6,而JQuery相容IE6。

//後代選擇器
$('#box p').css('color','red');//全相容
//JQuery為後代選擇器提供一個等價find()方法
$('#box').find('p').css('color','red');//與後代選擇器等價

//子選擇器
#box > p{          //IE6不支援
  color:red;
}
$('#box>p').css('color','red');//相容IE6

//JQuery為子選擇器提供了一個等價的children()方法
$('#box').children().css('color','red');//與子選擇器等價
next相鄰的後一個(即緊跟其後的第一個元素),nextAll是後N個
//nextAll選擇器(後面所有同級節點)
#box~p{         //IE6不支援
  color:red;
}
$('#box~p').css('color','red');      //相容IE6

//JQuery為nextAll選擇器提供了一個等價的方法 :nextAll();
$('#box').nextAll('p').css('color','red');  //與nextAll()選擇器等價

層次選擇器對節點的層次都是有要求的,比如子選擇器,只有子節點才可以唄選擇到,孫子節點和重孫子節點都無法選擇到。next和nextAll選擇器,必須是同一個層次的後一個和後N個,不在同一個層次就無法選取到了。

理論上,JQuery提供的方法:find()、next()、nextAll()和children()執行速度要快於使用高階選擇器。因為他們實現的演算法有一定的差異,高階選擇器是通過“Sizzle引擎”解析字串來獲取節點物件,而JQuery提供的方法則是通過querySelectorAll()操作直接得到的(IE6/7不支援)。但這種快慢的差異,對於客戶端指令碼來說沒有太大的實用性,並且速度的差異還要取決於瀏覽器和選擇的元素內容。

在find()、next()、nextAll()和children()這4種方法中,若不傳引數,就相當於傳遞了“*”,即任何節點,不建議這樣做。因為這樣做不但影響效能,而且由於精準度不佳,可能在複雜的HTML結構時產生怪異的結果。

$('#box').next();//相當於$('#box').next('*');

2.屬性選擇器

屬性選擇器
CSS模式JQuery模式描述
a[title]$('a[title]')獲取具有這個屬性的DOM物件
a[title=num1]$('a[title=num1]')獲取具有title屬性且屬性值為num1的DOM物件
a[title^=num]$('a[title^=num]')獲取具有title屬性且開頭屬性值匹配的DOM物件
a[title|=num]$('a[title|=num]')獲取具有title屬性且等於屬性值或開頭屬性值匹配後面跟一個“-”號的DOM物件
a[title$=num]$('a[title$=num]')獲取具有title屬性且結尾屬性值匹配的DOM物件
a[title!=num]$('a[title!=num]')獲取具有title屬性且不等於屬性值的DOM物件
a[title~=num]$('a[title~=num]')獲取具有title屬性且屬性值是以一個空格分割的列表,其中包含屬性之的DOM物件
a[title*=num]$('a[title*=num]')獲取具有title屬性且屬性值含有一個指定字串的DOM物件
a[bbb][title=num1]$('a[bbb][title=num1]')獲取具有title屬性且屬性值匹配的DOM物件
注:屬性選擇器也不支援IE6,所以在CSS中如果要相容低版本,那麼也是非主流的,而JQuery不需要考慮這個問題。