jQuery属性选择器匹配一个或多个

jQuery属性选择器匹配一个或多个,jquery,custom-data-attribute,Jquery,Custom Data Attribute,我有一个与一个或多个属性值匹配的选择器: var item = $(this).closest('.foo[data-category*="'+category+'"]') 这很有效。类别是一个或多个逗号分隔的单词 现在我试着这样使用它: if(item.attr('data-category*="'+category+'"')){ } 但它不起作用 我想也许可以试试这个: if(item.attr('data-category').split(',').indexOf(category)

我有一个与一个或多个属性值匹配的选择器:

var item = $(this).closest('.foo[data-category*="'+category+'"]')
这很有效。类别是一个或多个逗号分隔的单词

现在我试着这样使用它:

if(item.attr('data-category*="'+category+'"')){ }
但它不起作用

我想也许可以试试这个:

if(item.attr('data-category').split(',').indexOf(category) > -1){ }
但是,如果我的某些项目没有数据类别属性,这将引发一个错误。

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
 }
你怎么了

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

?

第一种方法是选择所有具有数据类别属性的元素,该属性包含您的类别,您的问题标题暗示您想要实现的类别,而后一种方法应该完成您在问题接缝中的示例想要实现的功能

这两种方法也可以在vanilla JS btw中完成:

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

更新: 在阅读了您的评论之后,我想再添加一个jQuery函数,这可能会有所帮助:如果您已经有一个jQuery项列表,并且您只想将所有这些项都发送给另一个选择器,那么您可以使用

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

而不是走遍所有的括号,检查是否有问题。

为什么每个括号中都有这个@Toniq这是一个技巧,逗号用于帮助匹配位于字符串开头或结尾的类别。yeap也是一个不错的解决方案,尽管多次运行选择器有点过分,+1I在我的示例中已经有一个jquery对象项,我需要测试对象是否具有类别属性。这就是为什么我不使用:$'[data category*='+category+']'。那么,.很可能正在做您需要的事情。我只是不太清楚你到底在问什么,因为你问题的标题与内容相矛盾。不是。比检查数据类别是否存在然后使用拆分“,”。索引类别更昂贵吗?据我所知。是使用香草。引擎盖下的火柴如果可用,现在,它应该得到高度优化,并使用同样的内部表示,在大多数浏览器中也用于应用CSS规则-因此,它不会比在CSS文件中应用带有属性选择器的CSS规则更昂贵。
if (this.matches('[data-category*="'+category+'"]')) { ... }
list.filter('[data-category*="'+category+'"]')