2011-10-19 20 views
10

如何從元素中移除除某些類以外的所有類。我假設我們不能使用removeClass()。假設我有一個<div class="aa bb cc dd ee ff"></div>,我想刪除除aa dd之外的所有類。我怎樣才能做到這一點。jQuery removeClass()但不是某些類

+0

爲什麼認爲不能用'不:' – GusDeCooL

+1

不僅僅是設置類'「AA DD」'夠了嗎? – alf

+0

@pinkie這些答案有幫助嗎? –

回答

17

你爲什麼不只是替換想要像這樣

$('#yourElement').attr('class',"aa dd"); 
4

您可以刪除所有,並添加需要的人回到:

$('#divID').removeClass() 
    .addClass('aa dd'); // add multiple classes by separating with space 

注:調用removeClass()不指定特定的類名中刪除所有的類。

+0

這假定aa和dd都存在於原始文件中。只保留它們需要更多的工作(只是檢查哪些在那裏,並且只有在它們以前存在時才加回來。) –

+0

@DanDaviesBrackett:的確如此,這就是OP的示例代碼所顯示的內容:)勞倫斯的答案雖然很明智。 – Sarfraz

+0

同意,除非OP增加額外的要求,以保持,如果只是已經存在... –

2

的一種方式,你可以做到這一點是僅僅覆蓋所有教學班,你想對類(ES)的類的類屬性保持。所以,如果您的div有「myDiv」的ID,那麼你可以做:

$('#myDiv').attr('class', 'aa dd'); 
2

如果你知道你要保持你可以重新添加(如其他已經顯示)哪些類。

我假設,雖然它現在還不知道是否已經應用了這些課程,所以我就買了一步:

var keep = ['aa','bb'], // list we'd like to keep 
    reAdd = [],   // ones that should be re-added if found 
    $el = = $(el);  // element we're working on 

// look for which we re-add (based on them already existing) 
for (var c = 0; c < keep.length; c++){ 
    if ($el.hasClass(keep[c])) reAdd.push(keep[c]); 
} 

// drop all, and only add those confirmed as existing 
$el 
    .removeClass()    // remove existing classes 
    .addClass(reAdd.join(' ')); // re-add the confirmed ones 
9

爲了使它乾淨了一點,你可以創建一個小的擴展。

jQuery.fn.removeClassExcept = function (val) { 
    return this.each(function() { 
     $(this).removeClass().addClass(val); 
    }); 
}; 

然後,你可以使用它像

$("selector").removeClassExcept("aa dd"); 

這裏有一個例子:http://jsfiddle.net/9xhND/

UPDATE

使用布拉德·克里斯蒂的邏輯,更新將現只存的是原本存在的類而不是添加新的類。 http://jsfiddle.net/9xhND/1/

jQuery.fn.removeClassExcept = function (val) { 
    return this.each(function (index, el) { 
     var keep = val.split(" "), // list we'd like to keep 
     reAdd = [],   // ones that should be re-added if found 
     $el = $(el);  // element we're working on 
     // look for which we re-add (based on them already existing) 
     for (var c = 0; c < keep.length; c++){ 
      if ($el.hasClass(keep[c])) reAdd.push(keep[c]); 
     } 

     // drop all, and only add those confirmed as existing 
     $el 
      .removeClass()    // remove existing classes 
      .addClass(reAdd.join(' ')); // re-add the confirmed ones 
    }); 
}; 
+0

這個插件與我的邏輯混合將是完美的解決方案。我擔心''div class =「a b c d f」>'和'$('div')。removeClassExcept('d e')'會添加永遠不存在的e類。 –

+0

你說得對。如果以前不存在,則會添加「e」。對於op的情況可能並不重要。我將添加一個更新以使兩個版本都可用。 –

7

.removeClass()接受作爲參數,將返回哪些類實際刪除功能..

所以

$('div').removeClass(function(i, class){ 
    // variable class hold the current value of the class attribute 
    var list = class.split(' '); // we create an array with the classes 
    return list.filter(function(val){ // here we remove the classes we want to keep 
     return (val != 'aa' && val != 'dd'); 
    }).join(' '); // and return that list as a string which indicates the classes to be removed.. 
}); 
+0

我喜歡這個解決方案。比刪除所有課程更漂亮。 –

+0

@Benoît大多數情況下,最簡單的答案總是最好的答案....親吻! –

+0

@Laurence Burke:是的,但在你的解決方案中,如果只有一個類,它會添加dd! –

4

的jQuery實際上提供了一個回調參數的removeClass方法,讓你可以使用一個簡單的JavaScript正則表達式來返回除了你不想刪除的類以外的所有類:

$('#myDiv').removeClass(function() { 
    return $(this).attr('class').replace(/aa|bb/g, ''); 
}); 

這樣,如果它們不存在,就不要添加類'aa'和'bb'。

你可以看到它在這裏的行動:http://jsfiddle.net/sr86u/3/