Как проверить с помощью jQuery, имеет ли элемент хотя бы один класс из списка указанных классов?

Пример html:

<div class="red"></div>
<div class="green"></div>
<div class="blue"></div>

<div class="apple"></div>

Я хочу перебрать элементы div и отфильтровать их, если у них нет класса «красный», «зеленый» или «синий».

var onlyColorDivs = $('div').hasClass( __________ );

Есть ли способ заполнить пробел в предыдущей строке, чтобы выполнить это. Или мне придется поместить классы цветов списка в массив и выполнить цикл?

Дайте мне знать, если нужны какие-либо разъяснения.


person Lokesh Dhakar    schedule 17.08.2010    source источник


Ответы (6)


Все ответы хороши и уместны. Но если вам очень нужна подобная функция, вы также можете использовать Monkey Patch для метода hasClass, чтобы он делал то, что вы хотите:

var _hasClass = $.fn.hasClass;
$.fn.hasClass = function (classNames) {
  if (!classNames || typeof classNames === "string" ) {
    return _hasClass.call(this, classNames); // Default behavior
  } else {
    // Take array and parse it for the filter method
    var classes = '.' + classNames.join(', .');
    return this.filter(classes).length > 0;
  }
};

Затем вы можете использовать его следующим образом:

$("div").hasClass(['red','green','blue']);
// or
$("div").hasClass('green');

Демо на JS Bin

person Doug Neiner    schedule 17.08.2010
comment
Мне нравится простота этого подхода; отправка нескольких классов в hasClass. Чтобы не сильно менять jquery, я решил вместо этого использовать filter(). Спасибо за код и демонстрацию. Нравится! - person Lokesh Dhakar; 18.08.2010

Есть ли что-то неправильное в использовании обычного способа выбора?

$(".red, .green, .blue");

Если у вас уже есть коллекция, которую вы хотите отфильтровать, скажите

$("div");

Вы можете использовать функцию filter, как уже упоминалось, но это будет медленнее, поэтому, если у вас есть выбор, кодируйте его в одном селекторе.

Расширение jQuery для уже поддерживаемой функциональности, доступной с другим синтаксисом, не требуется. Если вы настаиваете на использовании массива в качестве входных данных, будет быстрее присоединиться к нему в селекторе:

var classes = new Array("red", "green", "blue");
$("div." + classes.join(",div."));
person Boyan    schedule 24.11.2012

Это выберет только <div> элементов, которые имеют хотя бы один из этих 3 классов.

Попробуйте: http://jsfiddle.net/gADQn/

var onlyColorDivs = $('div.red, div.green, div.blue');
person user113716    schedule 17.08.2010

.filter('.red,.green,.blue')

Должен делать работу.

Или просто изначально выберите их:

$('.red,.green,.blue', context)
person meder omuraliev    schedule 17.08.2010

.filter(selector) — это функция, которую вы ищете. Вызов этого для выбора элементов jQuery улучшит выбор до тех элементов, которые соответствуют предоставленному вами селектору. Кроме того, вы можете просто выбрать только эти элементы для начала.

Так что либо: $('div').filter('.red, .green, .blue');

Or: $('div.red, div.green, div.blue');

Вот документация по использованию функции фильтра: http://api.jquery.com/filter/

И, наконец, демонстрация его использования: http://jsfiddle.net/Etb7R/

Этот небольшой скрипт выбирает все <div> и заполняет их текстом их атрибута класса, затем фильтрует только те, у которых есть классы «красный», «зеленый» или «синий», и применяет дополнительный класс, чтобы выделить их. Надеюсь, это должно дать вам хорошее представление о вашем диапазоне вариантов.

person Ender    schedule 17.08.2010

Определить, имеет ли элемент класс CSS с помощью jQuery

http://docs.jquery.com/Traversing/hasClass

person XstreamINsanity    schedule 17.08.2010
comment
Я хочу проверить несколько классов в одном выражении. В вопросе, который вы связали, также есть примеры для проверки одного класса. - person Lokesh Dhakar; 17.08.2010
comment
Да, я прокомментировал, прежде чем полностью прочитать вопрос. Поскольку ваша репутация была примерно такой же низкой, как и моя, я подумал, может быть, вы спрашивали, существует ли функция hasclass. Я новичок в jquery, поэтому не был уверен. Извини за это. - person XstreamINsanity; 17.08.2010