互斥数据属性选择器

时间:2016-11-05 15:58:37

标签: javascript jquery custom-data-attribute

是否可以根据互斥数据属性选择元素,例如:我希望.show()数据属性为div的任何country="united-kingdom"以及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();

2 个答案:

答案 0 :(得分:0)

您可以添加以逗号分隔的多个选择器

$('.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()

答案 1 :(得分:0)

  

我想.show()任何数据属性为country =“united-kingdom”的div,还有type =“partner”或“director”?

然后你需要一个selector group

#include <iostream>                                                             

int a=5;                                                                        
std::reference_wrapper<int> b=a;                                                

int main() {                                                                                                                           
    std::cout<<b<<std::endl;                                                    
}

说:匹配

的任何元素
  • 上课let parameters = [String: String]() [...] self.manager.upload( multipartFormData: { multipartFormData in for (key, value) in parameters { multipartFormData.append(value.data(using: .utf8)!, withName: key) } multipartFormData.append(imageData, withName: "user", fileName: "user.jpg", mimeType: "image/jpeg") }, to: path, [...] $('.post[data-country="united-kingdom"][data-type="partner"], .post[data-country="united-kingdom"][data-type="director"]').show(); 设为postdata-country设为united-kingdom

  • 上课data-typepartner设为postdata-country设为united-kingdom

“或”部分来自data-type,这使得它成为选择器组而不是单个选择器。

在评论中,你说过:

  

用户可能会选择每个分类术语中的十个或更多,这需要生成此条件的排列量。

在这种情况下,您最好使用director

,

然后

filter

在ES2016或更高版本中,您可以使用Array#includes - 它为您提供一个简单的布尔值 - 而不是var countries = ["united-kingdom"]; // This would be created from inputs var types = ["partner", "director"]; // This too ,您需要检查-1;你可以在ES2015及更早版本中使用polyfill ......:

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;
});

甚至可以采取进一步措施:

Array#indexOf

然后

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");
});

只要我们考虑ES2015和ES2016:

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));
    });
});
相关问题