2011-11-08 8 views
7

特定の要素のクラスリストをフィルタリングする最も効率的な方法は何ですか?jQueryで要素のクラスをフィルタリングしますか?

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

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

私はev.currentTarget.classListを通過するためのループを書くことができ知っているが、私は良い方法があるかどうかを知りたいです。

EDIT:「foo」と「bim」と警告を発することを明確にしたいと思います。私はの代わりに "bar"を置き換えたいと思う、私はちょうどバーではないクラスにアクセスできるようにしたい。ありがとう。

答えて

5

は、これを取得するには、no jQueryの方法はありませんが、私はどうなる:

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

がここにアクションでそれを参照してください:http://jsfiddle.net/PpUeX/2

+1

私はあなたが少し複雑すぎると思っています。 http://jsfiddle.net/ZkucZ/1/はどうですか? – pimvdb

+0

@pimvdb:String.replaceよりも 'filter'関数を使うのはあまり複雑ではありません。特に質問が効率性を求めているときに。プラス 'Array.filter'はIE <8でサポートされていません。 – Matt

+1

Touche、私は効率が足りませんでした。しかし、あなたには現在、無関係な要素が含まれています。 http://jsfiddle.net/PpUeX/1/ – pimvdb

4

あなたは要素からクラス全体の文字列を取得することができjQuery.fn.attr()を使用して、次にsplit()を配列に追加します。これを使用して任意の操作を実行できます。

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

EDIT:非「バー」クラスのすべてを取得する「jQueryの」-wayを提供するとして、あなたは一時的なクリックした要素のclone()removeClass()バークラスあなたが何かをする前にを作ることができますそれ:

$("div.bar").click(function(ev) { 
    var noBarClasses = $(this) 
    .clone().removeClass('bar') // <-- no more "bar" 
    .attr('class').split(' '); // [0:'foo'] 
}); 
関連する問題