互斥数据属性选择器
Mutually Exclusive Data Attribute Selectors
是否可以根据互斥的数据属性选择元素,例如:我想要.show()
任何具有country="united-kingdom"
数据属性的div
s,也具有type="partner"
或"director"
?例如:
$('.post[data-country="united-kingdom"]&[data-type="partner,director"]').show();
或
$('.post[data-country="united-kingdom"]&[data-type="partner"]or[data-type="director"]').show();
我想。show()任何div的数据属性为country="united-kingdom"还有type="partner"或"director" ?
然后你需要一个选择器组:
$('.post[data-country="united-kingdom"][data-type="partner"], .post[data-country="united-kingdom"][data-type="director"]').show();
表示匹配任何
的元素具有
post
类,data-country
设置为united-kingdom
,data-type
设置为partner
或
有
post
类,data-country
设置为united-kingdom
,data-type
设置为director
"or"部分来自,
,这使得它成为一个选择器组而不是单个选择器。
在评论中,你说:
用户可以选择10个或更多的分类法术语,这需要生成该条件的大量排列。
在这种情况下,您最好使用filter
:
var countries = ["united-kingdom"]; // This would be created from inputs
var types = ["partner", "director"]; // This too
然后var results = $(".post[data-country][data-type]").filter(function() {
var $this = $(this);
return countries.indexOf($this.attr("data-country") != -1 &&
types.indexOf($this.attr("data-type") != -1;
});
在ES2016或更高版本,你可以使用Array#includes
-它给你一个简单的布尔值-而不是Array#indexOf
,你必须检查-1;你可以在ES2015或更早的版本中使用polyfill…
var results = $(".post[data-country][data-type]").filter(function() {
var $this = $(this);
return countries.includes($this.attr("data-country") &&
types.includes($this.attr("data-type");
});
这甚至可以更进一步:
var criteria = {};
// From inputs, ...
criteria["country"] = ["united-kingdom"];
criteria["type"] = ["parter", "director"];
然后var keys = Object.keys(criteria);
var selector= ".post" + keys.map(function(key) {
return "[data-" + key + "]";
}).join();
var results = $(selector).filter(function() {
var $this = $(this);
return keys.every(function(key) {
return criteria[key].includes($this.attr("data-" + key));
});
});
只要我们考虑ES2015和ES2016:
const keys = Object.keys(criteria);
const results = $(selector).filter(() => {
const $this = $(this);
return keys.every(key => criteria[key].includes($this.attr("data-" + key)));
});
或者如果你真的想疯:
const keys = Object.keys(criteria);
const results = $(selector).filter(() =>
keys.every(key => criteria[key].includes(this.getAttribute("data-" + key)))
);
可以添加以逗号分隔的多个选择器
$('.post[data-country="united-kingdom"][data-type="artist"], .post[data-country="united-kingdom"][data-type="partner"]').show();
或者使用带有选择器的过滤器
$('.post[data-country="united-kingdom"]').filter('[data-type="artist"], [data-type="partner"]').show();
或带有回调
的过滤器var countries = ["united-kingdom", "india", "france"],
types = ["artist", "partner"];
$('.post').filter(function() {
return types.indexOf( $(this).data('type') ) !== -1 &&
contries.indexOf( $(this).data('coutry') ) !== -1;
}).show()
相关文章:
- jQuery最近父级的数据属性选择器
- 在 Jquery 中更改变量选择器的属性
- Angularjs和Jquery日期选择器数据绑定
- 动态添加数据时按数据属性查询JQuery选择器
- 在 jQuery 选择器中使用 HTML5 数据属性
- jQuery 选择器,用于通过比较元素的两个数据属性来选择元素
- JQuery 从类选择器上的数据属性创建一个数组
- 选择随数据属性更改
- HTML5 数据属性的 jQuery 选择器
- 使用数据属性在一个函数中Jquery多个选择器
- Jquery数据属性条件选择器
- 如何使用name属性作为选择器从该objects num属性获取数据
- CSS选择器按属性匹配元素's的名称开始
- 将选择器类的数据属性作为数组检索
- jQuery选择菜单数据属性和设置背景图片的URL
- Jquery更改选择器基于属性
- Onchange显示选择的数据属性不起作用
- 如何在jQuery中选择HTML5数据属性
- 将类选择器和属性选择器与jQuery相结合
- 不能使用jQuery选择器获取属性