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”个连续的元素组,并且可以像这样使用,以另一种颜色(用“alt”分类)为 tbody(“this”)的每 3 行着色

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

这对一个人来说效果很好。但是,如果我在几个 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

createPositionalPseudoSizzle中调用了一个函数,但它没有公开。通过复制该功能,我可以实际使用它并且它有效。我将其简化为:

$.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 回答