【问题标题】:Easier way to write multiple "not equal" attribute selectors?编写多个“不等于”属性选择器的更简单方法?
【发布时间】:2011-12-09 17:13:30
【问题描述】:

我目前有一个如下所示的选择器:

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

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

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

【问题讨论】:

    标签: jquery jquery-selectors selector


    【解决方案1】:

    不,没有办法以这种方式组合不相等的选择器。结果将被解释为字符串'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) 
    

    【讨论】:

      【解决方案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 的.filter() 工作. 第三个参数可以反转过滤器,以便指定的项目将被删除,而不是保留,这是 OP 用他们的 != 语法要求的。

      由于自动类型转换的奇妙之处,这也可以像这样使用以数字形式传递的值:

      $(".aaa").filterAttribute("row", [1, 2, 3], true)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-07
        • 2016-03-25
        • 2011-08-29
        • 2011-07-25
        • 1970-01-01
        • 2012-08-25
        相关资源
        最近更新 更多