4

擬似クラスを実装しようとしています (jQuery 1.8.3)。コードは次のとおりです。

(function($) {
    $.extend($.expr[':'], {
        group: $.expr.createPseudo(function(arg) {
            var index = 0;
            return function(element) {
                index += 1;
                var num = parseInt(arg, 10);
                if (isNaN(num)) {
                    return false;
                }
                return (((index-1) % (num*2)) < num);
            }
        })
    });
})(jQuery);

このセレクターの目的は、要素の「n」個の連続するグループにスタイルを適用することであり、そのように使用して、tbody (「this」) の 3 行ごとに別の色 (「alt」で分類) で色を付けることができます。

$(this).children(':visible').has('td').filter(':group(3)').addClass('alt')

これは 1 つの tbody に適しています。しかし、複数の tbodies (" $('..').each" コンストラクトを使用) を反復処理している場合、その間でインデックスはリセットされません。この効果は jquery 1.6 で正常に達成できました。これは、(基礎となる「グループ」関数パラメーターに) セット内のインデックスが自然にあったためです。

(function($) {
    $.extend($.expr[':'], {
        group: function(element, index, matches, set) {
            var num = parseInt(matches[3], 10);
            if (isNaN(num)) {
                return false;
            }
            return index % (num * 2) < num;
        }
    });
})(jQuery);

jquery 1.8 で同じ効果を得るにはどうすればよいでしょうか?

あなたの洞察に感謝します!

4

1 に答える 1

2

SizzlecreatePositionalPseudoで呼び出される関数がありますが、公開されていません。関数を複製することで、実際に使用でき、機能しました。単純化して次のようにしました。

$.extend($.expr[':'], {
  group: $.expr.createPseudo(function(arg){
    return $.expr.createPseudo(function(seed, matches){
      for (var i=0; i<seed.length; i++) 
        if (i % (arg * 2) >= arg)
          matches.push(seed[i]);
      })
  })
});

テスト用にjsFiddleを作成します。

Sizzle の内部はわかりません。seed疑似フィルターが処理する要素のリストであり、matches返されるリストであり、フィルターを通過したものを示します。

createPositionalPseudoも を変更しますが、上記のコードは変更seedしません。何が入っているかわからないので、問題が発生する可能性があります。ただし、私のテストでは問題なく動作します。

jsFiddle の JavaScript には が含まれていますが、create_group_pseudo_safe単純化されていません。簡素化に問題がある場合は、その安全なバージョンの機能が機能するはずです。

于 2012-11-21T09:40:16.003 に答える