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+'"]')