jQuery селектор атрибутов соответствует одному или нескольким - PullRequest
0 голосов
/ 05 мая 2020

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

var item = $(this).closest('.foo[data-category*="'+category+'"]')

Это хорошо работает. (категория - это одно или несколько слов, разделенных запятыми)

Теперь я пытаюсь использовать его так:

if(item.attr('data-category*="'+category+'"')){ }

, но он не работает.

Я, может, попробую это:

if(item.attr('data-category').split(',').indexOf(category) > -1){ }

, но это вызовет ошибку, если некоторые из моих элементов не имеют атрибута data-category.

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Что не так с

$('[data-category*="'+category+'"]')

или

if ($(this).is('[data-category*="'+category+'"]')) { ... }

?

Первый shoudl выбирает все элементы, имеющие data-category -атрибут, содержащий ваш category (что подразумевает заголовок вашего вопроса, это то, чего вы хотите достичь), в то время как последний должен делать то же, что и ваши if примеры в шве вопроса, которые вы пытаетесь предпринять.

И то, и другое также можно сделать в ванили JS btw:

let elementsWithAttr = document.querySelectorAll('[data-category*="'+category+'"]')

и

if (this.matches('[data-category*="'+category+'"]')) { ... }

Обновление:

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

list.filter('[data-category*="'+category+'"]')

вместо того, чтобы проходить по всем из них и проверять с if.

0 голосов
/ 05 мая 2020

jquery.attr является НЕ сопоставителем селектора , а просто возвращает атрибут элемента с этим именем. Это проблема. Чтобы проверить, соответствует ли атрибут элемента одному из списка значений, разделенных запятыми, выполните следующие действия:

let itemCats = item.attr('data-category');
if ( itemCats/*attribute exists*/ && -1 !==(','+itemCats+',').indexOf(','+category+',')/*has category*/ ) {
     // matches
 }

, вы даже можете сделать однострочник:

if ( -1 !==(','+(item.attr('data-category')||'')+',').indexOf(','+category+',') ) {
     // matches
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...