Более простой способ написать несколько «не равных» атрибутов селекторов? - PullRequest
2 голосов
/ 09 декабря 2011

У меня сейчас есть селектор, который выглядит так:

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

Есть ли более простой способ написать это? Я попробовал это, но это не сработало:

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

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

Если вам нужно сделать это много, и нет лучшего способа решить эту проблему, прикрепив соответствующие классы к одинаковым группам строк, то вы можете написать короткий плагин 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)
2 голосов
/ 09 декабря 2011

Нет, нет способа объединить неравные селекторы таким образом. Результат будет интерпретирован как строка '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) 
...