2

そのため、クラスがすべて一連のクラスで見つかった場合にのみ、複数のクラスを持つ要素を選択しようとしています。

例。id="foo" と class="red blue" の要素があります

次に、特定の色のセットをいくつか用意します。そこから、セット内にあるすべての要素を選択したいと考えています。

セット {red} を持っているとしましょう。何も見つからないはずです。{red blue} の場合、'foo' が見つかるはずです。そして、{red blue green} がある場合は、'foo' がまだ見つかるはずです。

複数のセレクターでこれを試しましたが、セットが {red blue} より大きくなると機能しません

$.('.red') will return foo (which is not what I want.)
$.('.red.blue') will return foo (good!)
$.('.red.blue.green') will return nothing (bad.)

ここの「or」演算子が私が望むものかどうかもわかりません。$.('.red,.blue') は、赤または青の要素を返しますが、これは私が望むものではありません。私はすでにその機能を理解しています。

「オールイン」機能はありますか?

アイテムのセットで可能なすべての選択クエリを反復することを考えていましたが、セットが 4 アイテムを超えると、非常に多くのクエリになります。

4

6 に答える 6

1

注:これは概念的なソリューションです...特定の要件に合わせて調整する必要があります

function x($targets, array){
    var filtered = $targets.filter(function(){
        var classNames = this.className.split(/\s+/), valid = true;
        $.each(classNames, function(idx, value){
            if($.inArray(value, array) == -1){
                valid = false;
                return false;
            }
        });
        return valid;
    });
    //do something
    return filtered;
}

それから

//this is the set of elements against which the tests have to be done
var $targets = $('#ct').children();

x($targets, ['red']);
x($targets, ['red', 'green']);

デモ:フィドル

于 2013-09-12T07:14:45.640 に答える
0

あなたの質問の文脈が正確にはわかりませんが、たとえば色に関連するものであれば、クラスの数は限られていると思います。

私がそれについて行く方法は反対です。持っている色を選択する代わりに、期待した結果と一致しない色を除外します。

たとえば、 color class があるとします.blue, .red, .green, .yellow。例で使用したフィルターと一致させるには、次のようになります

:not(.blue,.green,.yellow) /*foo does not match, it is blue*/
:not(.green,.yellow) /*Match*/
:not(.yellow) /*Match*/

セットを構築する方法を理解する必要があります。しかし、それは別の質問です。

于 2013-09-12T06:52:37.453 に答える
0

編集:
私は初めてそれを逆にしました。これはより良いサンプルコードです:

var requiredClasses = ['red', 'blue'];  
var relevant = $('#my_div span');

var result = [];
elements_loop:
for(i = 0; i< relevant.lenght; ++){
   var el = relevant[i];
   var classList = el.attr('class').split(/\s+/);
   $.each( classList, function(i, cls){
       if (! $.inArray(cls, requiredClasses) {
          //skip the element if any of its class is not in the set.
          break elements_loop;        
       }
   });
   result.push(el);
}
return result;

アイデアを提供するだけで、コードを最適化できます。

于 2013-09-12T07:01:10.427 に答える