2011-10-18 9 views
5

Mam div, który wygląda jakjQuery dostać pewnych klas, ale nie inne

<div class="draggable resizable abc table shadow"></div> 

Clases nie są w określonej kolejności. Jeśli wykonam $('div').attr('class'), otrzymam listę wszystkich klas dla tego div. Chcę tylko uzyskać klasy, które nie są resizable, , draggable lub table. W tym przypadku chcę abc shadow. Jak mam to zrobic.

+0

więc chcesz rzeczywiste nazwy klas, a nie elementy HTML? –

+2

Wskazówka: Otrzymasz lepsze odpowiedzi, jeśli wyjaśnisz, co chcesz zrobić, zamiast (lub oprócz) zapytać o jeden ze sposobów, w jakie możesz go osiągnąć. Dlaczego chcesz listę zajęć minus pozostałe? (Co zamierzasz z nimi zrobić.) – Phrogz

Odpowiedz

4
var all = "draggable resizable abc table shadow"; 
var some = all.replace(/(?:^|\s)(resizable|draggable|table)(?=\s|$)/g, ''); 

console.log(some); 
// " abc shadow" 

console.log(some.replace(/^\s+|\s+$/g,'')); 
// "abc shadow" 

console.log(some.split(/\s+/)); 
// ["", "abc", "shadow"] 

Należy pamiętać, że nie trzeba drugi replace (nie trzeba zdejmować początkowe i końcowe spacje), jeżeli chcesz to ciąg znaków, który jest odpowiedni do ustawiania className do.

Ale wtedy, jeśli starasz się po prostu usunąć zestaw znanych klas od elementu, o wiele lepiej po prostu:

$(...).removeClass("draggable resizable table"); 

Alternatywny (bez konieczności regex):

var ignore = {resizable:1, draggable:1, table:1}; 
var all = "draggable resizable abc table shadow".split(' '); 
for (var subset=[],i=all.length;i--;) if (!ignore[all[i]]) subset.push(all[i]); 

console.log(subset); 
// ["shadow","abc"] 

console.log(subset.join(' ')); 
// "shadow abc" 
+0

Dzięki, ale dostaję przecinek przed każdym classe ', abc, shadow' Chcę mieć przestrzeń po każdej klasie, więc wygląda na' abc shadow' – Pinkie

+0

@Pinkie: 'some.split (/ \ s + /)' zwraca szyk. Możesz łączyć jego elementy w dowolny sposób. –

+0

Odejście od podziału da ci rozdzielony spacją ciąg znaków, który będzie odpowiedni do ustawienia klasy (jeśli to właśnie próbujesz zrobić). – Phrogz

0

Możesz sprawdzić poszczególne zajęcia, używając .hasClass.

$("div").hasClass("class"); 
+7

to nie odpowiada na pytanie – Pinkie

+0

To jest opatentowany, że oferuje lepsze rozwiązanie niż to, co robisz. Zamiast tego powinieneś powiedzieć nam podstawowy problem, abyśmy mogli zapewnić lepsze rozwiązanie. –

0

Ta odpowiedź została udzielona tutaj. Get class list for element with jQuery.

można rozszerzyć to po prostu za sznurki w tablicy, które nie są „skalowalny, przeciągany lub stół”

+0

Nie ma to znaczenia dla pytania. – Pinkie

+0

Nie jestem pewien, dlaczego uważasz, że nie ma to znaczenia dla pytania. Wskazany post zapewnia sposób na pobranie wszystkich nazw klas z elementu i umieszczenie ich w tablicy. Następnie bierzesz tę tablicę i analizujesz 3 klasy, których nie chcesz. –

+0

Aby poprawić swoją odpowiedź, prawdopodobnie powinieneś dopasować kod znaleziony w odpowiedzi do pytania zamiast po prostu połączyć się z nim. –

1

@Phrogz odpowiedź jest dobra. Wygląda na to, że jest kresem regex. Ponieważ nie wiem regex, że dobrze, tutaj jest moje zdanie na jej temat:

var aryClasses = $("div").attr("class").split(" "); 
var aryDesiredClasses = new Array(); 

for(var i = 0; i < aryClasses.length; i++) { 
    if(aryClasses[i] != "table" 
        && aryClasses[i] != "resizable" 
        && aryClasses[i] != "draggable") 
     aryDesiredClasses.push(aryClasses[i]); 
} 

alert(aryDesiredClasses.join(" ")); 

Oto a working fiddle to illustrate.

+1

Myślę, że chcesz negacji ('if (aryClasses [i]! =" Resizable "|| ...)') zamiast dopasowywania dokładnie znanych klas. – Phrogz

+0

@Phrogz, Masz absolutną rację. Zaktualizowano. –

4

Wtyczka:

(function($) { 
    $.fn.getClasses = function(exclude) { 
     var remove = {}; 

     for(var i = exclude.length; i--;) { 
      remove[exclude[i]] = true; 
     } 

     return $.map(this.attr('class').split(/\s+/g), function(cls) { 
      return remove[cls] ? null : cls; 
     }); 
    }; 
}(jQuery)); 

Zastosowanie:

var classes = $('div').getClasses(['resizable', 'draggable', 'table']); 
+0

Nice. +1 za pokazanie mi, że '$ .map' wraz z' null' automatycznie wypakowuje wynik. (Mogę osobiście zmienić nazwę metody na 'getClassesWithout', ale to więcej preferencji niż cokolwiek innego.) – Phrogz

+2

@ Jos: Nie wiem, dlaczego to zrobiłeś, ale to niczego nie zmienia i faktycznie JSLint woli w inny sposób. –

+0

@FelixKok Mój zły, masz rację, na pierwszy rzut oka myślałem, że to literówka! –

1
 function getDesiredClass(removedClassArr){ 
      var classArray = $("selector").attr('class').split(" "); 
      var desiredClassArray = []; 
      for(var i = 0; i < classArray.length; i++){ 
       if (!isUnDesiredClass(removedClassArr, classArray[i])){ 
        desiredClassArray .push(classArray[i]); 
       } 
      } 
      return desiredClassArray; 
     } 
     function isUnDesiredClass(removedClassArr , cls){ 
     for(var i = 0; i < removedClassArr.length; i++){ 
      if(removedClassArr[i] == cls){ 
       return true; 
      } 
     } 
     return false; 
    } 
0
var classes = $('div').not('.resizable, .draggable, .table').attr('class').split(' '); 
0

przyjrzeć się tej jsFiddle, mam coś pracuje jak co chciałeś.

także rzucić okiem na jQuery :not selectors

+0

To wcale nie jest to, o co pro-programuje ... –

Powiązane problemy