2011-11-08 36 views
7

Cách hiệu quả nhất để lọc danh sách các lớp trên một phần tử đã cho là gì?Lọc ra các lớp của một phần tử trong jQuery?

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

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

Tôi biết tôi có thể viết một vòng lặp đi qua ev.currentTarget.classList nhưng tôi muốn biết nếu có cách nào tốt hơn.

EDIT: Tôi muốn làm rõ rằng tôi muốn cảnh báo cho tôi biết "foo" và "bim". Tôi không muốn thay thế "thanh", tôi chỉ muốn có thể truy cập vào các lớp KHÔNG phải là thanh. Cảm ơn.

Trả lời

5

Không có jQuery cách để có được điều này, nhưng tôi sẽ làm gì:

$("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(" ")); 
}); 

Nhìn thấy nó trong hành động ở đây: http://jsfiddle.net/PpUeX/2

+1

Tôi nghĩ bạn đang làm cho nó hơi phức tạp một chút. Điều gì về http://jsfiddle.net/ZkucZ/1/? – pimvdb

+0

@pimvdb: Tôi sẽ không nói sử dụng chức năng 'filter' trên String.replace ít phức tạp hơn; đặc biệt là khi câu hỏi là yêu cầu hiệu quả. Plus 'Array.filter' không được hỗ trợ trong IE <8. – Matt

+1

Touche, tôi đã bỏ lỡ hiệu quả. Mặc dù, máy của bạn hiện bao gồm một phần tử không liên quan. http://jsfiddle.net/PpUeX/1/ – pimvdb

4

Bạn có thể lấy toàn bộ chuỗi lớp từ nguyên tố này bằng cách sử dụng jQuery.fn.attr() , và sau đó split() nó vào một mảng, mà bạn có thể làm bất cứ điều gì bạn muốn.

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

EDIT: Đối với việc cung cấp một "jQuery" hai chiều nhận được tất cả các "bar" lớp học không, bạn có thể làm một tạm thời clone() của phần tử nhấp và removeClass() thanh lớp trước khi bạn làm bất cứ điều gì với nó:

$("div.bar").click(function(ev) { 
    var noBarClasses = $(this) 
    .clone().removeClass('bar') // <-- no more "bar" 
    .attr('class').split(' '); // [0:'foo'] 
}); 
Các vấn đề liên quan