2011-12-14 81 views
17

例如,假設我有以下幾點:jQuery:是否可以選擇元素中只有一個類的元素,有可能多達3個類?

<span class="a b c">Has class a, b, and c</span> 
<span class="a">Has class a</span> 
<span class="b c">Has class b and c</span> 
<span class="a c">Has class a and c</span> 
<span class="a c">Has class a and c</span> 
<span class="a">Has class a</span> 

現在,假設我要選擇具有只有類的所有元素。
只有第二個也是最後一個span纔會被選中。
有沒有簡單的方法來做到這一點?

回答

4

我想,如果你想做到這一點,你可以簡單地做:

var spans = $("span[class='a']"); 
+3

字條給OP:你不必包括在選擇單詞'span`像菲爾在這裏。如果有div或imgs可能具有所需的類,並且想要選擇這些類,那麼`$(「[class ='a']」)`會執行此操作。 – maxedison 2011-12-14 21:50:09

+1

這個問題是如果屬性包含任何空格,它將會中斷。類選擇器沒有這個問題。 – 2011-12-14 21:52:27

32
$('.a').not('.b, .c') 

這將選擇a類的所有元素沒有bc。但是,他們仍然可以擁有類d,e等等。如果您真的只想使用除a之外的其他類別的元素,請使用Phil的答案。

9

(用於見下爲什麼你可能不希望做的正是在這個問題問)

您可以使用[class="a"]「屬性等於選擇器」,雖然它是脆:

$('span[class="a"]').hide(); 

問題是,如果你的類屬性中有任何空格,那麼它將會中斷。看到這個小提琴:http://jsfiddle.net/c7DP7/

您可以通過執行上使用普通類選擇這些項目基本查詢解決這個問題,然後進一步篩選他們,而只檢查a設置(並在第二過濾器修剪空格)。看到這個小提琴:http://jsfiddle.net/uD48E/1/

$('.a') 
    .filter(function(index){ 
     return $(this).attr("class").trim() == "a"; 
    }) 
    .hide(); 

的問題看起來是努力使更多的「面向未來」的代碼,但具體做法是更脆。拒絕與您正在過濾的當前班級無關的所有班級可能會因與班級a(例如稍後添加的無關班級de)無關的原因而中斷工作。如果您將來使用jQuery的HTML可能會發生更改,這一點非常重要。

更好的方法是隻過濾掉影響類a含義的類。考慮到這種靈活性,實際上使代碼更具前瞻性。請參閱maxedison's answer以獲取最佳方式。

1

另一種方法是刪除這些類,然後檢查是否有任何類仍然存在。如果沒有,執行函數:

JS Fiddle

$('.a').each(function() { 
    var $this = $(this); 
    if (!$this.removeClass('a').attr('class').length) { 
     //Execute function here 
    } 
}); 
相關問題