Изотопная фильтрация с использованием select в vanilla JS не работает должным образом - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь создать фильтр с изотопом в javascript, но мне не повезло переписать jQuery-версию из официального примера

// external js: isotope.pkgd.js

// init Isotope
var $grid = $('.grid').isotope({
  itemSelector: '.color-shape'
});

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

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

// flatten object by concatting values
function concatValues( obj ) {
  var value = '';
  for ( var prop in obj ) {
    value += obj[ prop ];
  }
  return value;
}

Мой ванильный код JS

// external js: isotope.pkgd.js, babel-core

// addEventListener Shorthand
function addEvent(element, evnt, funct) {
  if (element.attachEvent) {
    return element.attachEvent(`on${evnt}`, funct);
  }
  return element.addEventListener(evnt, funct, false);
}

// flatten object by concatting values
const concatValues = function(obj) {
  let value = '';
  for (const prop in obj) {
    value += obj[prop];
  }
  return value;
};


const filtersContainer = document.querySelector('.o-filter-container');
const filtersEl = document.querySelector('#filters');
// store filter for each group
const filters = {};

// init Isotope
const iso = new Isotope(filtersContainer, {
  itemSelector: '.o-filter-item',
});

addEvent(filtersEl, 'change', function(event) {
  const selectEl = event.target;
  // get group key
  const filterGroup = selectEl.getAttribute('value-group');
  // set filter for group
  filters[filterGroup] = event.target.value;
  // combine filters
  const filterValue = concatValues(filters);
  // set filter for Isotope
  iso.arrange({
    filter: () => filterValue,
  });
  iso.arrange();
});

Я не уверен, что не так с моим кодом. Я потратил некоторое время, чтобы прочитать документы (которые больше сфокусированы на решениях jQuery), форумы и вопросы github и не смог найти никакого ответа. Я заметил, что метод .arrange() эквивалентен .isotope() для jQuery, поэтому вам нужно передать функцию {filter} вместо просто значения.

Так что я надеюсь, что кто-то укажет мне направление, чтобы решить эту двухдневную борьбу!

1 Ответ

0 голосов
/ 27 апреля 2019

Хорошо, я понял - две проблемы:

  • * Значение 1004 * должно быть пустым
  • Фильтрация по классу по годам, например .2019, приводит кошибка:
matches-selector.js:50 Uncaught DOMException: Failed to execute 'matches' on 'Element': '.2019' is not a valid selector.
    at matchesSelector (http://localhost:3000/wp-content/themes/myTHEME/dist/scripts/app.bundle.js:4064:33)
    at http://localhost:3000/wp-content/themes/myTHEME/dist/scripts/app.bundle.js:482:14
    at SubClass.proto._filter (http://localhost:3000/wp-content/themes/myTHEME/dist/scripts/app.bundle.js:444:23)
    at SubClass.proto.arrange (http://localhost:3000/wp-content/themes/myTHEME/dist/scripts/app.bundle.js:368:25)
    at HTMLDivElement.<anonymous> (http://localhost:3000/wp-content/themes/myTHEME/dist/scripts/app.bundle.js:3883:11)
matchesSelector @ matches-selector.js:50
(anonymous) @ isotope.js:289
proto._filter @ isotope.js:251
proto.arrange @ isotope.js:175
(anonymous) @ filter.js:41

Итак, добавление .year- исправило это!

...