Изотоп метафиззы - деактивировать фильтр, если нет результата комбинации
Я использую изотоп метафиззы для фильтрации предметов.
У меня есть 2 ряда фильтров: категория 1 (кабель, инструменты, материал1, материал2) и категория 2(кабель1, кабель2, инструмент1, инструмент2).
Можно ли деактивировать фильтр (с помощью CSS, например, серый), если при объединении двух категорий не будет результата?
Пример: я нажимаю на фильтр 'stuff2', и в категории 2 нет ни одного элемента, который соответствует, поэтому jQuery добавляет класс к категории 2, как выделение серым цветом.
Мой изотопный код:
jQuery.noConflict();
(function($){
var $container = $('#container'),
filters = {};
$container.isotope({
itemSelector : '.element',
{mfilterscript}
{mfilterscript2}
});
// filter buttons
$('.filter a').click(function(){
var $this = $(this);
// don't proceed if already selected
if ( $this.hasClass('selected') ) {
return;
}
var $optionSet = $this.parents('.option-set');
// change selected class
$optionSet.find('.selected').removeClass('selected');
$this.addClass('selected');
// store filter value in object
// i.e. filters.color = 'red'
var group = $optionSet.attr('data-filter-group');
filters[ group ] = $this.attr('data-filter-value');
// convert object into array
var isoFilters = [];
for ( var prop in filters ) {
isoFilters.push( filters[ prop ] )
}
var selector = isoFilters.join('');
$container.isotope({ filter: selector });
return false;
});
})(jQuery);
1 ответ
Это абсолютно возможно.
Вам нужно сделать пару вещей
1) проверьте длину массива фильтров для всех возможных будущих комбинаций фильтров
Например, скажем, у вас есть список фруктов, каждый из которых имеет класс "фрукты" и класс для фруктов типа "яблоко", "груша", "апельсин" и т. Д.
Вы бы сделали что-то вроде этого:
$('a.fruit').each(function() {
var $this = $(this);
var getVal = $this.attr('data-filter-value');
var numItems = $('img'+getVal+':not(.isotope-hidden)').length; // <-- This example is for filtering img tags but just replace it with whatever element you're actually filtering
if(!$(this).hasClass('active') && !$that.hasClass('fruit') ){ // <-- i.e. it's a fruit that has not already disabled by previous filter combinations
if(numItems === 0){
$this.addClass('disabled');
}
else {
$this.removeClass('disabled');
}
}
else if( $this.hasClass('active') && $this.hasClass('disabled') ){
$this.removeClass('disabled');
}
else if(!$(this).hasClass('active') ) {
if(numItems > 0){
$this.removeClass('disabled');
}
}
});
2) Вам нужно будет добавить код для обработки ваших отключенных фильтров, чтобы они не могли быть запущены. Лучшее место для этого - в начале вашей процедуры фильтрации. Т.е., прежде чем любая фильтрация будет обработана, вы хотите выйти из подпрограммы.
Есть много способов сделать это (e.preventDefaults
например, но в этом случае, возможно, безопаснее просто return false
поэтому нам не нужно беспокоиться о повторном связывании поведения по умолчанию впоследствии).
Например, вы можете сделать что-то вроде этого:
$('.filter a').click(function(){
// exit directly if filter already disabled
if ($(this).hasClass('disabled') ){
return false;
} else if ($(this).hasClass('selected') ) {
return false;
}
...
}); // close routine
Вот живой пример всего, что работает
И вот весь JavaScript для этого примера.
Надеюсь, это поможет!