jQuery: возможно ли выбрать элементы только с одним классом среди элементов с потенциально 3 классами? - PullRequest
19 голосов
/ 15 декабря 2011

Например, скажем, у меня есть следующее:

<span class="a b c">Has class a, b, and c</span>  
<span class="a">Has class a</span>  
<span class="b c">Has class b and c</span> 
<span class="a c">Has class a and c</span> 
<span class="a c">Has class a and c</span> 
<span class="a">Has class a</span>

Теперь предположим, что я хочу выбрать все элементы, которые имеют только класс a.
Значение только второй ибудут выбраны последние span с.
Есть ли простой способ сделать это?

Ответы [ 4 ]

34 голосов
/ 15 декабря 2011
$('.a').not('.b, .c')

Это выберет все элементы с классом a, которые не имеют b или c.Тем не менее, они могут иметь класс d, e и т. Д. Используйте ответ Фила, если вы действительно хотите, чтобы элементы не имели класса, отличного от a.

9 голосов
/ 15 декабря 2011

(см. Ниже, почему вы, возможно, не хотите делать в точности то, что задается в вопросе)

Вы можете использовать [class="a"] «атрибут равно селектору», хотя он хрупкий:

$('span[class="a"]').hide();

Проблема в том, что если у вас есть какой-либо пробел в атрибуте класса, он сломается.Смотрите эту скрипку: http://jsfiddle.net/c7DP7/

Это можно исправить, выполнив базовый запрос к этим элементам с помощью обычного селектора классов, а затем отфильтруйте их, проверяя, установлен ли только a (и обрезайте пробелы в этот момент.фильтр).Смотрите эту скрипку: http://jsfiddle.net/uD48E/1/

$('.a')
    .filter(function(index){
        return $(this).attr("class").trim() == "a";
    })
    .hide();

Вопрос выглядит так, как будто он пытается сделать больше кода "будущего", но этот конкретный подход более хрупок.Отказ от всех классов, которые не связаны с текущим классом, для которого вы фильтруете, может привести к поломке по причинам, не связанным с классом a (например, несвязанный класс d или e, который будет добавлен позже).Это важно, если в будущем HTML-код, к которому вы применяете jQuery, может быть изменен.

Лучший способ сделать это - отфильтровать только те классы, которые влияют на значение класса a.Именно такая гибкость делает ваш код более перспективным.См. ответ Македисона , чтобы узнать, как лучше всего это сделать.

4 голосов
/ 15 декабря 2011

Полагаю, если вы хотите сделать это, вы можете просто сделать:

var spans = $("span[class='a']");
1 голос
/ 13 сентября 2015

Другой метод - удалить эти классы, а затем проверить, остались ли какие-либо классы. Если нет, выполните функцию:

JS Fiddle

$('.a').each(function () {
    var $this = $(this);
    if (!$this.removeClass('a').attr('class').length) {
       //Execute function here
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...