同位素v2网格-多个过滤器-隐藏空过滤器

问题描述 投票:1回答:1

我当前的同位素网格具有两个用于对网格项目进行排序的下拉过滤器。第一个过滤器是菜单类型,第二个过滤器是饮料类型。但是,每种菜单类型都不包含所有饮料类型,因此当选择某些过滤器配置时,没有显示结果,这是正确的。但是我想阻止这种情况的发生,当用户选择第一个过滤器时,第二个过滤器将隐藏空类型。

当前过滤器的工作代码笔:https://codepen.io/whitinggg/pen/zYGEaNb

这是我以前的过滤器代码:

// Select Filters
jQuery(function ($) {
    var $grid = $('.grid');
    var $selects = $('div#filterGroup select').change(function() {
        var selector = $selects.get().map(function(el) { // map the select elements ...
            return $(el).val(); // ... to an array of values
        }).join('') || '*'; // if joined array is empty-string, then default to a single '*'
        $grid.isotope({
            'filter': selector
        });
        return false;
    });

    $grid.imagesLoaded().progress( function() {
      $grid.isotope('layout');
    });
  });

我已尝试将本主题的代码从Internet上有关此主题的其他链接更改为以下内容,但运气不好,无法正常工作。

// Select Filters
jQuery(function ($) {
    var $grid = $('.grid');
    var $selects = $('div#filterGroup select').change(function() {
        var selector = $selects.get().map(function(el) { // map the select elements ...
            return $(el).val(); // ... to an array of values
        }).join('') || '*'; // if joined array is empty-string, then default to a single '*'
        $grid.isotope({
            'filter': selector
        });
        return false;
    });

//Hide Empty Filters
    var DROP = $('div#filterGroup select option:not([data-filter=""])');
    // list of all class in html
    var strall = ''; $('.grid-item').each(function(el){ strall += $(this).attr('class')  });
    // remove select if not in strall.. TODO : needs improvement, this is kind a hack
    DROP.each(function(el){
      var nowfilter = $(this).attr('data-filter').replace('.', ''); // co_kenya
      if( strall.indexOf( nowfilter ) == -1 ){
        console.log( 'this one is missing ' + nowfilter );
        $(this).remove();
      }
    });

    $grid.imagesLoaded().progress( function() {
      $grid.isotope('layout');
    });
  });

这可能吗?任何帮助,不胜感激!

javascript jquery filter jquery-isotope
1个回答
0
投票

Working codepen

首先,在每个下拉列表中添加一个ID,以便我们区分它们。

<select id="menu-selector" class="filter option-set" data-filter-group="menu">
[...]
<select id="type-selector" class="filter option-set" data-filter-group="categories">

然后,为每个下拉列表添加一个更改侦听器。我们将查看菜单下拉更改侦听器的代码。

首先,从选定的下拉列表中获取类过滤器:

 $('#menu-selector').change(function() {
     var selectedClass = $('#menu-selector option:selected').attr('value');

然后,我们将选择与该类型匹配的所有网格项目,以查看它们还具有哪些其他类。这些其他类将是可用的类型

     var availableTypes = $(`.grid-item${selectedClass}`)
       .toArray()
       .flatMap(div => Array.from(div.classList.values())) //get all of the classes
       .filter(i => !['grid-item', selectedClass.substring(1)].includes(i));  //eliminate useless ones

最后,在另一个下拉菜单上切换disabled属性,仅启用那些可用的属性。

     $('#type-selector option')
         .each( (i,el) => $(el).prop('disabled', el.value != ""  && !availableTypes.includes(el.value.substring(1))));

应该这样做。类型下拉列表的更改处理程序相同,但引用了相反的下拉列表。有关详细信息,请检查the codepen

© www.soinside.com 2019 - 2024. All rights reserved.