2016-11-05 4 views
2

Можно выбрать элементы на основе взаимоисключающих данных атрибутов, например: Я хотел бы .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(); 

ответ

0

Я хотел бы .Show() любые дивы с атрибутом данных страны = «объединены-королевство», а также с типом = «партнером» ИЛИ «директор»?

Тогда вы хотите selector group:

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

«или» часть поступает от ,, что и делает его группу селектор, а не один селектор.


В комментариях, вы сказали:

Пользователя может выбрать десять или более каждый термин таксономии, которая требует создания нагрузок перестановок это условное.

В этом случае, вы можете быть лучше с 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; и there'a polyfill вы можете использовать в ES2015 и раньше ...:

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))) 
); 
+0

Это дает результаты, которые я получаю. Наверное, я был чем-то немного короче :-). Пользователь может выбрать десять или более из каждого таксономического термина, который требует генерации нагрузок перестановок этой группы селекторов. –

+0

@KevinNugent: В этом случае вам может быть лучше с 'filter'; Я добавил примечание в конце. –

+0

@KevinNugent: Взял обобщение немного дальше ... –

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() 
+0

Я не думаю, что это совсем так, я должен уточнить ... У меня есть несколько меню таксономии: страна и тип. Пользователь сможет выбрать несколько из каждого списка, чтобы запросить результаты, соответствующие стране: uk OR ireland ИЛИ france AND partner or artist. Поэтому, если запись была указана как data-country = «France» и data-type = «artist», она будет возвращена. Я добавляю и удаляю значения в/из пары или массивов, а затем фильтрую содержимое с помощью .show(). –

+0

Вы можете использовать фильтр с обратным вызовом и фильтровать практически любой атрибут данных, который вы хотите, но вы более конкретны в отношении того, что вы пытаетесь сделать здесь? – adeneo

+0

Спасибо @adeneo, я думаю, что T.J. Ответ Кроудера ниже имеет его ... –

Смежные вопросы