JQuery несколько раскрывающихся меню фильтра

У меня есть картинки, которые скрываются и отображаются на основе нескольких выпадающих меню. Я пытаюсь, чтобы 2 и, возможно, более выпадающие меню работали вместе, чтобы уточнить поиск.

Если я выберу элемент в первом раскрывающемся списке, я хотел бы применить второй фильтр и т. Д. С любым дополнительным раскрывающимся списком.

Мне нужна помощь с JQuery. Моя текущая проблема заключается в том, что 2-й фильтр никогда не срабатывает. Он перезаписывается и сбрасывает фильтр. Если возможно, я бы хотел добавить третий фильтр, чтобы еще больше сузить поиск, чтобы найти именно то, что я ищу. Вот пример кода..

$('select').change(function(){
var current = $(this).attr('value');

if(current == 'all'){
    $('#FilterContainer').children('div.all').show();
} 

else {

    $('#FilterContainer').children('div:not(.' + current + ')').hide();
$('#FilterContainer').children('div.' + current).show();
 }

  return false;
})

HTML

  <p>Filter: </p>
        <select class="filterby">
        <option value="all"><h5>Show All</h5></option>
        <option value="1"><h5>One</h5></option>
        <option value="2"><h5>Two</h5></option>
        <option value="3"><h5>Three</h5></option>
      </select>



      <p>Location: </p>
        <select class="filterby">
        <option value="all"><h5>All Locations</h5></option>
        <option value="nj"><h5>NJ</h5></option>
        <option value="ny"><h5>NY</h5></option>
        <option value="pa"><h5>PA</h5></option>
      </select>


  <div id="FilterContainer">

  <div class="all 1 nj">Test One NJ</div>
  <div class="all 1 ny">Test One NY</div>
  <div class="all 1 pa">Test One PA</div>
  <div class="all 2 nj">Test Two NJ</div>
  <div class="all 2 ny">Test Two NY</div>
  <div class="all 2 pa">Test Two PA</div>
  <div class="all 3 nj">Test Three NJ</div>
  <div class="all 3 ny">Test Three NY</div>
  <div class="all 3 pa">Test Three PA</div>
  <div class="all 1 nj">Test One NJ</div>
  <div class="all 1 pa">Test One PA</div>
  <div class="all 1 pa">Test One PA</div>
  <div class="all 2 nj">Test Two NJ</div>
  <div class="all 2 ny">Test Two NY</div>
  <div class="all 2 ny">Test Two NY</div>

3 ответа

Решение

Попробуй это -

$("select.filterby").change(function(){
    var filters = $.map($("select.filterby").toArray(), function(e){
        return $(e).val();
    }).join(".");
    $("div#FilterContainer").find("div").hide();
    $("div#FilterContainer").find("div." + filters).show();
});

с LIVE DEMO

Чтобы заставить его работать, как вы просили, вы можете попробовать следующий код:

$('select').change(function () {
    var current = this.value;
    $.each($('#FilterContainer').find('div.all').not('.hidden').not('.'+current), function(){
        $(this).addClass('hidden');
    });
    $.each($('.'+current), function () {
        $(this).removeClass('hidden');
    });
});

И добавив CSS:

.hidden{
    display:none;
}

Дает вам эту рабочую скрипку: http://jsfiddle.net/Q5DpP/5/

ТЕМ НЕ МЕНИЕ:

Я не думаю, что это именно то, куда вы хотите пойти. Пожалуйста, играйте с этим, и вы поймете. Если поменять верхний фильтр, то с нижним фильтром все в порядке. Но если вы снова измените верхний фильтр, он продолжит скрываться... в основном, если что-то скрыто, оно не вернется. Это становится логической загадкой, и структуру вашего тестирования необходимо изменить. Это становится все сложнее, когда вы проходите уровни глубже.

Вы можете рассмотреть возможность добавления / удаления разных классов на каждом уровне фильтра, а затем проверять только эти фильтры.

Попробуй это:

$('select').change(function () {
  var current = this.value; // <------get the value this way.
   if (current == 'all') {
      $('#FilterContainer').find('div.all').show();
   } else {
      $('#FilterContainer').find('div').hide();
      $('#FilterContainer').find('div.all.' + current).show();
   }
   return false;
});

скрипка

Другие вопросы по тегам