【问题标题】:MixItUp with two select / dropdown fieldsMixItUp 有两个选择/下拉字段
【发布时间】:2015-10-22 22:37:48
【问题描述】:

我在 JS 方面不够先进,无法充分发挥作用。

我有两个带有选项的选择字段:

    <select name="" id="filter-position">
      <option value="all">Filter by position</option>
      <option value=".instructor">Instructor</option>
      <option value=".leader">Leader</option>
      <option value=".blah">Blah</option>
      <option value=".whatever">Whatever</option>
    </select>

    <select name="" id="filter-location">
      <option value="all">Filter by position</option>
      <option value=".portland">Portland</option>
      <option value=".missoula">Missoula</option>
      <option value=".chicago">Chicago</option>
      <option value=".newyork">New York</option>
    </select>

过滤后的项目所在的容器看起来有点像这样:

    <ul id="filter-container">
        <li class="mix">...</li>
        <li class="mix">...</li>
        <li class="mix">...</li>
        <li class="mix">...</li>
        <li class="mix">...</li>
        <li class="mix">...</li>
    </ul>

我可以让每一个都正确过滤,但不能一起过滤(即 AND)。我使用的 JS 代码是这样的:

  $(function(){
    var $positionSelect = $('#filter-position'),
        $locationSelect = $('#filter-location'),
        $container = $('#filter-container');

    $container.mixItUp({});

    $positionSelect.on('change', function(){
      $container.mixItUp('filter', this.value);
    });

    $locationSelect.on('change', function(){
      $container.mixItUp('filter', this.value);
    });
  });

如果我按一个选择进行过滤,则事情会正确过滤。如果我然后按另一个过滤,它会覆盖第一个过滤器。我想要的是它们都可以使用。

我知道有一种方法可以让它工作,但我不确定如何使用&lt;select&gt; 让该连接字符串执行文档的Advanced Filtering 部分中记录的“和”逻辑。帮忙?

【问题讨论】:

    标签: javascript jquery mixitup


    【解决方案1】:

    你真的很亲密!由于 mixItUp API 的工作原理,过滤器不是附加的(例如,当您调用 mixItUp.filter 时,它不会将新过滤器添加到已经处于活动状态的内容中)。因此,只要其中一个更改,您只需要从两个下拉列表的值构造一个新的过滤器字符串。你可以这样做:

    $(function(){
        var $positionSelect = $('#filter-position'),
            $locationSelect = $('#filter-location'),
            $container = $('#filter-container');
    
        $container.mixItUp({});
    
        $('#filter-position, #filter-location').on('change', function() {
    
          var filterString = $positionSelect.val() + $locationSelect.val();
    
          $container.mixItUp('filter', filterString);
        });
    
      });
    

    在这种情况下,我选择使用 jQuery .val() 而不是原生的 .value,因为您已经在使用 jQuery,val() 在这种情况下可能会更可靠。如果您遇到麻烦,请告诉我。

    您可能还想更改此设置:

    <option value="all">Filter by position</option>
    

    到这里:

    <option value="">Filter by position</option>
    

    对于您的两个下拉菜单,否则您可能会遇到一些奇怪的行为。

    【讨论】:

    • 啊哈!感谢您花时间解释一下。在看到你的回复之前,我已经很接近了。这对我来说是一个整体。再次感谢!
    【解决方案2】:

    使用逗号,如.. $('#filter-location, #filter-container') .on('改变', function(){ ... ;)

    【讨论】:

    • 这并没有达到预期的效果。过滤器仍会导致“或”逻辑(即,通过选择 1 或选择 2 进行过滤)。我需要它通过选择 1 和选择 2 进行过滤。
    【解决方案3】:

    这样的……

    $(function(){
        $container = $('#filter-container');
    
        $container.mixItUp({});
    
        $container.on('change','#filter-position, #filter-location', function(){
            $container.mixItUp('filter', this.value);
        });
    });
    

    【讨论】:

    • 这不太奏效 - 没有任何反应。我想知道 $container.on('change'... 位 - 为什么容器会改变?
    猜你喜欢
    • 2018-03-29
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 2021-03-17
    • 1970-01-01
    • 2017-05-06
    相关资源
    最近更新 更多