2011-11-08 12 views
7

Jaki jest najskuteczniejszy sposób filtrowania listy klas na danym elemencie?Odfiltruj klasy elementów w jQuery?

<div class="foo bar"></div> 
<div class="bim bar"></div> 

$("div.bar").click(function(ev) { 
    alert("The non-bar class was:" + ???); 
}); 

Wiem, mógłbym napisać pętli for, aby przejść przez ev.currentTarget.classList ale chcę wiedzieć, czy istnieje lepszy sposób.

EDYCJA: Chciałbym wyjaśnić, że chcę, aby alert zawierał informację "foo" i "bim". Nie chcę, aby zastąpić "pasek" "Po prostu chcę mieć dostęp do klas, które NIE są barowe. Dzięki.

Odpowiedz

5

Nie ma jQuery sposobem, aby dostać to, ale chciałbym zrobić:

$("div.bar").click(function(ev) { 
    var nonBarClasses = (' ' + this.className + ' ').replace(' bar ', ' ').split(/ +/); 

    nonBarClasses.shift(); 
    nonBarClasses.pop(); 

    // nonBarClasses is now an array, with each element a class that isn't `bar` 

    alert("The non-bar class was: " + nonBarClasses.join(" ")); 
}); 

Zobacz go w akcji tutaj: http://jsfiddle.net/PpUeX/2

+1

Myślę, że robisz to trochę zbyt skomplikowane. A co z http://jsfiddle.net/ZkucZ/1/? – pimvdb

+0

@pimvdb: Nie powiedziałbym, że używanie funkcji 'filter' przez String.replace jest mniej skomplikowane; zwłaszcza, gdy pytanie wymaga skuteczności. Plus 'Array.filter' nie jest obsługiwany w IE <8. – Matt

+1

Touche, brakowało mi wydajności. Chociaż twoja zawiera obecnie element obcy. http://jsfiddle.net/PpUeX/1/ – pimvdb

4

można dostać całą klasę ciąg z elementu za pomocą jQuery.fn.attr() , a następnie split() go do tablicy, za pomocą której można zrobić wszystko, co chcesz.

$("div.bar").click(function(ev) { 
    var classes = $(this).attr('class').split(' '); // [0:'foo', 1:'bar'] 
}); 

EDIT: Jeśli chodzi o dostarczanie „jQuery” -Way uzyskania wszystkich nie- „bar” klas, można zrobić tymczasowy clone() elementu klikniętego i removeClass() klasy bar, zanim zrobisz cokolwiek z to:

$("div.bar").click(function(ev) { 
    var noBarClasses = $(this) 
    .clone().removeClass('bar') // <-- no more "bar" 
    .attr('class').split(' '); // [0:'foo'] 
}); 
Powiązane problemy