Как мне получить доступ к фильтрам через внешний URL и выделить только активный класс фильтра в меню?

#javascript #html #jquery #css #wordpress

#javascript #HTML #jquery #css #wordpress

Вопрос:

Моя галерея Isotope, которую вы можете увидеть здесь, использует приведенный ниже код для обновления хэшей URL-адресов в адресной строке в зависимости от выбранного класса. Если вы выберете класс Mishmash , вы увидите https://thedivtagguy.com/#filter=.mishmash в адресной строке. Эта часть работает хорошо, но если вы попытаетесь перейти к URL-адресу категории Mishmash, который я показал вам выше, он выделяет только класс фильтра и фактически не сортирует сетку.

РЕДАКТИРОВАТЬ: похоже, это работает и работает.

Почему это не работает, код кажется действительным?

 <script>
(function($) {
    

function getHashFilter() {
  var hash = location.hash;
  // get filter=filterName
  var matches = location.hash.match( /filter=([^amp;] )/i );
  var hashFilter = matches amp;amp; matches[1];
  return hashFilter amp;amp; decodeURIComponent( hashFilter );
}
$( function() {

  var $grid = $('.isotope');

  // bind filter button click
  var $filters = $('#filters').on( 'click', 'li', function() {
    var filterAttr = $( this ).attr('data-filter');
    // set filter in hash
    location.hash = 'filter='   encodeURIComponent( filterAttr );
  });

  var isIsotopeInit = false;

  function onHashchange() {
    var hashFilter = getHashFilter();
    if ( !hashFilter amp;amp; isIsotopeInit ) {
      return;
    }
    isIsotopeInit = true;
    console.log(hashFilter);
    // filter isotope
    $grid.isotope({
      // itemSelector: '.selector.col-md-6.col-lg-4',
      filter: hashFilter
    });
    // set selected class on button
    if ( hashFilter ) {
      $filters.find('.active').removeClass('active');
      console.log($filters.find('.active'));
      $filters.find('[data-filter="'   hashFilter   '"]').addClass('active');
    }
  }

  $(window).on( 'hashchange', onHashchange );

  // trigger event handler to init Isotope
  onHashchange();
});
    
})( jQuery );

  

Во-вторых, я попытался добавить эти ссылки в свое главное меню (чтобы по сетке можно было перемещаться сверху, и если пользователь находится на других страницах, он перенаправит на главную страницу и просто отфильтрует сетку), и я ввел полные URL-адреса для каждой категории в качестве ссылок, поэтому главное менюимеет элемент Mishmash , который имеет ссылку https://thedivtagguy.com/#filter=.mishmash . Как вы можете видеть на изображении ниже, по какой-то причине все ссылки активны, но навигация по ним бесполезна; только URL в адресной строке изменяется без фактической фильтрации. Какая часть кода вызывает это и как мне сделать другие ссылки неактивными?

ОБНОВЛЕНИЕ: видеоклип проблемы доступен здесь

введите описание изображения здесь

Комментарии:

1. оба они отлично работают в Chrome

2. @ash Вы пробовали переключать классы с помощью главного меню вверху? Я тоже использую Chrome, но, похоже, он не работает.

3. ознакомьтесь с моим ответом ниже

Ответ №1:

В вашем коде есть две основные проблемы:

  1. Вы .isotope за выбор контейнера, но у вас нет контейнера с классом isotope , вместо этого измените свой код на var $grid = $('.masonry');

  2. У вас есть некоторый класс и идентификаторы, установленные для вашего дополнительного меню навигации, используйте те же классы и для вашего главного меню навигации, если вы хотите, чтобы была выделена активная ссылка на фильтр. Что означает добавление:

    2.1 data-filter атрибут для li элементов

    2.2 изменить var $filters = $('#filters') на var $filters = $('#filters, #menu-portfolio-1')

Комментарии:

1. Спасибо за ваш ответ! Первая часть сработала как шарм, я не знаю, почему я не сделал этого раньше. Я пытался динамически добавлять класс в jQuery вместо того, чтобы делать это просто так! Однако вторая часть по-прежнему не работает. Вот скриншот кода для вторичной навигации , я добавляю класс m-filters в свои пункты меню, но безуспешно. Должно ли это быть m-filters , filters или data-filters ?

2. @namnban проверьте обновленный ответ. Также у вас неправильный стиль .m-nav-menu--horizontal ul.menu li.menu-item.current_page_item > a на вашей странице.

3. Спасибо, Дипен. Добавление data-filter атрибута к li элементам в WordPress — это еще одна битва, с которой я не буду вас беспокоить. Я попробую то, что вы предлагаете. Еще раз спасибо! Я назначу вам награду, как только мне позволит таймер.

Ответ №2:

для отображения активных категорий и отсортированных элементов… вы должны назначить свою onHashchange() внутреннюю функцию загрузки окна.

 window.onload = function() {
   onHashchange()
};
  

дополнительная информация MDN

Комментарии:

1. Спасибо за ваш ответ! Просто чтобы убедиться, это то, что я помещаю перед закрывающим <head> тегом. Проблема все еще не решена, как вы можете видеть в этом видеоролике: gofile.io/d/5aJ4oA

2. на самом деле есть ошибка синтаксиса, я обновляю свой ответ, обновляю ваш код