Фильтры и окно поиска с использованием изотопа на той же странице

Я использую фильтр и окно поиска, оба с помощью isotope.js. Фильтр и поиск работают нормально независимо, но когда я пытаюсь выполнить поиск после использования фильтра, поиск не работает. Наличие одного экземпляра изотопа для обоих также не помогает делу. Пожалуйста, предложите мне что-нибудь, что я могу попробовать. Ниже приведены коды для обоих сценариев:

<script type="text/javascript"> 
   $( function() {
   // init Isotope
   var $grid = $('.grid').isotope({
   itemSelector: '.grid-item',
   layoutMode: 'fitRows'
});

$('.filter').click(function() {
$('#loadMore').hide();
//alert("inside isotope script");
var filterValue = $( this ).attr('data-filter');
//alert(filterValue);
$grid.isotope({ filter: filterValue});
});
});
</script>

<!-- Script for search --> 
<script type="text/javascript"> 
 $( function() {
// quick search regex
var qsRegex;
// init Isotope

var $grid = $('.grid').isotope({
itemSelector: '.grid-item',
layoutMode: 'fitRows',
filter: function() {
  return qsRegex ? $(this).text().match( qsRegex ) : true;
}
});

// use value of search field to filter
var $quicksearch = $('.quicksearch').keyup( debounce( function() {
$('#loadMore').hide();
//alert("key up");
qsRegex = new RegExp( $quicksearch.val(), 'gi' );
//alert(qsRegex);
$grid.isotope();
}, 200 ) );

 });

// debounce so filtering doesn't happen every millisecond
function debounce( fn, threshold ) {
  var timeout;
return function debounced() {
  if ( timeout ) {
    clearTimeout( timeout );
  }
  function delayed() {
    fn();
    timeout = null;
  }
  timeout = setTimeout( delayed, threshold || 100 );
  }
}
 </script>

1 ответ

У меня была похожая проблема несколько дней назад:) Попробуйте этот кодовый десандро http://codepen.io/desandro/pen/1f0c676d32473ccf8b6d053c07aa9ba6/ Вы можете объединить фильтры с функцией...

    $( function() {

  // filter functions
  var filterFns = {
    greaterThan50: function() {
      var number = $(this).find('.number').text();
      return parseInt( number, 10 ) > 50;
    },
    even: function() {
      var number = $(this).find('.number').text();
      return parseInt( number, 10 ) % 2 === 0;
    }
  };

  // store filter for each group
  var filters = {
    greaterThan50: 'greaterThan50'
  };

  // init Isotope
  var $container = $('.isotope').isotope({
    itemSelector: '.color-shape',
    filter: function() {
      var isMatched = true;
      var $this = $(this);

      for ( var prop in filters ) {
        var filter = filters[ prop ];
        // use function if it matches
        filter = filterFns[ filter ] || filter;
        // test each filter
        if ( filter ) {
          isMatched = isMatched && $(this).is( filter );
        }
        // break if not matched
        if ( !isMatched ) {
          break;
        }
      }
      return isMatched;
    }
  });

  $('#filters').on( 'click', '.button', function() {
    var $this = $(this);
    // get group key
    var $buttonGroup = $this.parents('.button-group');
    var filterGroup = $buttonGroup.attr('data-filter-group');
    // set filter for group
    filters[ filterGroup ] = $this.attr('data-filter');
    // arrange, and use filter fn
    $container.isotope('arrange');
  });

  // change is-checked class on buttons
  $('.button-group').each( function( i, buttonGroup ) {
    var $buttonGroup = $( buttonGroup );
    $buttonGroup.on( 'click', 'button', function() {
      $buttonGroup.find('.is-checked').removeClass('is-checked');
      $( this ).addClass('is-checked');
    });
  });

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