更简单的方法来编写多个“不相等”的属性选择器?

时间:2011-12-09 17:13:31

标签: jquery jquery-selectors selector

我目前有一个看起来像这样的选择器:

$("span[row!='2'][row!='5'][row!='1']");

有没有更简单的方法来写这个?我试过这个,但它不起作用:

$("span[row!='1,2,5']");

2 个答案:

答案 0 :(得分:2)

没有办法以这种方式组合不相等的选择器。结果将被解释为字符串'1,2,3'而不是单个值。你必须列举这些案例。

你可以编写一个函数来使这更容易编写。例如

var makeNotEquals = function(name) {
  var clause = '';
  for (var i = 1; i < arguments.length; i++) {
    clause = clause + '[' + name + '!=\'' + arguments[i] + '\']';
  }
  return clause;
}

用法

var selector = 'span' + makeNotEquals('row', 2, 1, 5);
$(selector) 

答案 1 :(得分:2)

如果你必须做很多事情并且没有更好的方法通过将相应的类附加到类似的行组来解决这个问题,那么你可以编写一个简短的jQuery插件,你可以传递一行数组这样的数字:

$("span[row]").filterAttribute("row", ['1','2','5'], true)

这是一个实现:

$.fn.filterAttribute = function(attr, values, reverse) {
    var remaining = [];
    this.each(function(index, el) {
        for (var i = 0; i < values.length; i++) {
            if (el.getAttribute(attr) == values[i]) {
                remaining.push(el);
                break;
            }
        }
    });
    if (reverse) {
        return(this.not(remaining));
    } else {
        return($(remaining));
    }
}

您可以在此处查看:http://jsfiddle.net/jfriend00/WwrSY/

注意,此插件的正常操作是从jQuery对象中过滤项目,以便删除不匹配的项目,返回一个新的jQuery对象,其中包含指定的项目(如jQuery的{{1}第三个参数可以反转过滤器,以便指定的项目将被移除,而不是保留,这是OP用他们的!=语法要求的。

由于自动类型转换的奇迹,这也可以像这样使用,并将值作为数字传递:

.filter()