Показать сообщение отдельно
  #1 (permalink)  
Старый 26.02.2021, 18:08
Интересующийся
Отправить личное сообщение для lev90 Посмотреть профиль Найти все сообщения от lev90
 
Регистрация: 31.01.2021
Сообщений: 10

В фильтре объединить кнопки и списки
Добрый день!

Есть фильтр на основе Isotope. В нем мне необходимо добавить выпадающий список со значениями. По отдельности, все отлично работает, а объединить все вместе не получается.

Исходный скрипт фильтра:
// External js: jquery, isotope.pkgd.js, bootstrap.min.js, bootstrap-slider.js
$(document).ready( function() {

  var buttonFilters = {};
  var buttonFilter = '*';
  var rangeFilters = {
      'height': {'min':150, 'max': 185},
      'weight': {'min':50, 'max': 90}
    };

  // Initialise Isotope
  var $grid = $('.grid').isotope({
    itemSelector: '.item',
    layout: 'masonry',
    filter: function() {
      var $this = $(this);
      var height = $this.attr('data-height');
      var weight = $this.attr('data-weight');
      var isInHeightRange = (rangeFilters['height'].min <= height && rangeFilters['height'].max >= height);
      var isInWeightRange = (rangeFilters['weight'].min <= weight && rangeFilters['weight'].max >= weight);
      return $this.is( buttonFilter ) && (isInHeightRange && isInWeightRange);
    }
  });

  // Initialise Sliders
  var $heightSlider = $('#filter-height').slider({ tooltip_split: true, min: 130,  max: 220, range: true, value: [150, 180] });
  var $weightSlider = $('#filter-weight').slider({ tooltip_split: true, min: 40,  max: 150, range: true, value: [50, 90] });

  function updateRangeSlider(slider, slideEvt) {
    console.log('Current slider:' + slider);
    var sldmin = +slideEvt.value[0],
        sldmax = +slideEvt.value[1],
        filterGroup = slider.attr('data-filter-group'),
        currentSelection = sldmin + ' - ' + sldmax;

      slider.siblings('.filter-label').find('.filter-selection').text(currentSelection);

      console.log('Filtergroup: '+ filterGroup);
      rangeFilters[filterGroup] = {
        min: sldmin || 0,
        max: sldmax || 100000
      };
      $grid.isotope();
  }

  $heightSlider.on('slideStop', function(slideEvt){
    var $this =$(this);
    updateRangeSlider($this, slideEvt);
  });
  $weightSlider.on('slideStop', function(slideEvt){
    var $this =$(this);
    updateRangeSlider($this, slideEvt);
  });

  $('.filters').on( 'click', '.btn', function() {
    var $this = $(this);
    var $buttonGroup = $this.parents('.btn-group');
    var filterGroup = $buttonGroup.attr('data-filter-group');
    buttonFilters[ filterGroup ] = $this.attr('data-filter');
    buttonFilter = concatValues( buttonFilters ) || '*';
    console.log( buttonFilter )
    $grid.isotope();
  });

  $('.btn-group').each( function( i, buttonGroup ) {
      var $buttonGroup = $( buttonGroup );
      $buttonGroup.on( 'click', '.btn-filter', function() {
          $buttonGroup.find('.is-checked').removeClass('is-checked');
          $(this).addClass('is-checked');
      });
  });
});

function concatValues( obj ) {
  var value = '';
  for ( var prop in obj ) {
    value += obj[ prop ];
  }
  return value;
}

Скрипт который необходимо добавить
var buttonFilters = {};

$('.filters').on( 'change', function( event ) {
  var $select = $( event.target );
  // get group key
  var filterGroup = $select.attr('data-filter-group');
  // set filter for group
  buttonFilters[ filterGroup ] = event.target.value;
  // combine filters
  var filterValue = concatValues( buttonFilters );
  // set filter for Isotope
  $grid.isotope({ filter: filterValue });

Исходный HTML
<div class="filters filter-section">
        <div class="row">
            <div class="col-sm-4">
                <span class="filter-label">Color:</span>
                <div class="btn-group" role="group" data-filter-group="color">
                    <span class="btn btn-sm btn-default btn-filter is-checked" data-filter="">Any</span>
                    <span class="btn btn-sm btn-default btn-filter" data-filter=".red">Red</span>
                    <span class="btn btn-sm btn-default btn-filter" data-filter=".blue">Blue</span>
                    <span class="btn btn-sm btn-default btn-filter" data-filter=".yellow">Yellow</span>
                </div>
            </div>
            <div class="col-sm-4">
                <span class="filter-label">Size:</span>
                <div class="btn-group" role="group" data-filter-group="size">
                    <span class="btn btn-sm btn-default btn-filter is-checked" data-filter="">Any</span>
                    <span class="btn btn-sm btn-default btn-filter" data-filter=".small">Small</span>
                    <span class="btn btn-sm btn-default btn-filter" data-filter=".wide">Wide</span>
                    <span class="btn btn-sm btn-default btn-filter" data-filter=".big">Big</span>
                    <span class="btn btn-sm btn-default btn-filter" data-filter=".tall">Tall</span>
                </div>
            </div>
            <div class="col-sm-4">
                <span class="filter-label">Shape:</span>
                <div class="btn-group" role="group" data-filter-group="shape">
                    <span class="btn btn-sm btn-default btn-filter is-checked" data-filter="">Any</span>
                    <span class="btn btn-sm btn-default btn-filter" data-filter=".round">Round</span>
                    <span class="btn btn-sm btn-default btn-filter" data-filter=".square">Square</span>
                </div>
            </div>

        <div class="sliders row">
            <div class="col-sm-4">
                <div class="bootstrap-slider">
                    <span class="filter-label">Weight Range: <span class="filter-selection"></span></span>
                    <b class="filter-min">40</b> <input id="filter-weight" type="text" class="bootstrap-slider" value="" data-filter-group="weight"> <b class="filter-max">150</b>
                </div>
            </div>
            <div class="col-sm-4">
                <div class="bootstrap-slider">
                    <span class="filter-label">Height Range: <span class="filter-selection"></span> </span>
                    <b>140</b><input id="filter-height" type="text" class="bootstrap-slider" value="" data-slider-step="1" data-filter-group="height"> <b>220</b>
                </div>
            </div>
        </div>

        <div class="grid">
            <div class="item small round red " data-height="180" data-weight="75"><span class="content">Height:180<br>Weight: 75</span></div>
            <div class="item small round blue" data-height="179" data-weight="73"><span class="content">Height:179<br>Weight: 73</span></div>
            <div class="item small round yellow" data-height="162" data-weight="53"><span class="content">Height:162<br>Weight: 53</span></div>
        </div>
</div>

<script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/jquery.isotope/2.2.2/isotope.pkgd.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/bootstrap-slider/9.2.0/bootstrap-slider.js'></script>

Добавляемый список
<div class="col-sm-4">
 <span class="filter-label">ColorMY:</span>
 <select class="btn-group" data-filter-group="colormy">
  <option value="">any</option>
  <option value=".red">red</option>
  <option value=".blue">blue</option>
  <option value=".yellow">yellow</option>
 </select>
</div>

Понимаю, что изменить необходимо нижеприводимый код, но как не знаю.
$('.filters').on( 'click', '.btn', function() {
    var $this = $(this);
    var $buttonGroup = $this.parents('.btn-group');
    var filterGroup = $buttonGroup.attr('data-filter-group');
    buttonFilters[ filterGroup ] = $this.attr('data-filter');
    buttonFilter = concatValues( buttonFilters ) || '*';
    console.log( buttonFilter )
    $grid.isotope();
  });

Кто знает, подскажите пожалуйста. В интернете ничего похожего не нашел.
Заранее спасибо.
Ответить с цитированием