Помогите поймать и убить глюки

Iga

Гуру форума
Регистрация
12 Янв 2014
Сообщения
425
Реакции
83
Мне тут один программер напрограммировал...
В общем сайт на WP, установлен плагин фильтрации facet. Там по-умолчанию поля поиска по цене и по ID работают через доп. кнопку "go". Т.е., чтобы отфильтровать по цене, нужно сначала ввести диапазон цены, затем нажать кнопку "go", и после этого уже основную кнопку фильтра "поиск".
Задача была поставлена сделать так, чтобы фильтрация работала без этой промежуточной кнопки "go".

Задача была выполнена, но спустя какое-то время, обнаружили глюки, исходящие от этого скрипта.
В частности, если в нормальном браузере вводить что-то в форму связи, то в адресной строке появляется ?fwp_lot_number_facet=?fwp_lot_number_facet=?fwp_lot_number_facet= с каждым введённым символом. В эксплорере эта строка появляется независимо от ввода и сбрасывает показ формы, соответственно, пользователь часто не может выбрать нужный пункт.

Посмотрите, пожалуйста, кто соображает в программинге, код:
Код:
jQuery(document).ready(function($){
     $(document).on('input','.facetwp-number-min',function(){
           let url = window.location.href,
                value = $(this).val();

         if(url.indexOf("fwp_price_facet") != -1){
             url = delPrm(url,'fwp_price_facet');
         }
            if(url.indexOf("=") && url.indexOf("?")  != -1){

                url += '&fwp_price_facet='+value+'%2C'+$('.facetwp-number-max').val();

            }else{
                url += '?fwp_price_facet='+value+'%2C'+$('.facetwp-number-max').val();
            }

            window.history.pushState(null, '', url);
            // $('.facetwp-submit').click();
           setTimeout(set_filter, 2000);
           
      });

     $(document).on('input','.facetwp-number-max',function(){
         let url = window.location.href,
                value = $(this).val();

         if(url.indexOf("fwp_price_facet") != -1){
             url = delPrm(url,'fwp_price_facet');
         }
            if(url.indexOf("=") && url.indexOf("?")  != -1){

                url += '&fwp_price_facet='+$('.facetwp-number-min').val()+'%2C'+value;

            }else{
                url += '?fwp_price_facet='+$('.facetwp-number-min').val()+'%2C'+value;
            }

            window.history.pushState(null, '', url);

            // throttle('set_filter');
            let timer = null;

           setTimeout(set_filter, 2000);

             
            // $(document).find('.facetwp-number-min').focus();
     });


     $(document).on('input',function(){
         

         let url = window.location.href,
                value = $(this).val();

         if(url.indexOf("fwp_lot_number_facet") != -1){
             url = delPrm(url,'fwp_lot_number_facet');
         }
            if(url.indexOf("=") && url.indexOf("?")  != -1){

                url += '&fwp_lot_number_facet='+$('.facetwp-number-min').val();

            }else{
                url += '?fwp_lot_number_facet='+$('.facetwp-number-min').val();
            }

            window.history.pushState(null, '', url);

            // throttle('set_filter');
            let timer = null;

           setTimeout(set_filter, 2000);

     });   
     
      function delPrm(Url,Prm) {
        var a=Url.split('?');
        var re = new RegExp('(\\?|&)'+Prm+'=[^&]+','g');
        Url=('?'+a[1]).replace(re,'');
        Url=Url.replace(/^&|\?/,'');
        var dlm=(Url=='')? '': '?';
        return a[0]+dlm+Url;
    };

    function set_filter(){
       
         $('.facetwp-autocomplete-update').click();
   
    }


   $(document).on('click','.simplefavorite-button',function(){
      let favorite = Number($('.favorites_span_icon_id').text().replace(/\D+/g,""));

      if($(this).hasClass('active')){
         console.log('popalo');
         favorite-=1;
      }else{
         favorite+=1;
      }
      console.log($('.simplefavorite-button-count').text());
      $('.favorites_span_icon_id').text("Избранные обьекты "+favorite);
   })
});

Сайт, на котором всё это глючит Для просмотра ссылки Войди или Зарегистрируйся

Всех с наступающим, а кого-то и с наступившим!
 
Потому что разработчик заложил изначально какой-то сложный алгоритм, я бы сказал - неверный.
Тут надо избавляться от setTimeout и кривой функции delPrm, и перейти на обычный replace

Код:
let url = window.location.href.replace(/fwp_price_facet=([0-9]+%2C[0-9]+)/,'fwp_price_facet=111');
window.history.pushState(null, '', url);

Тоже самое с лотом делаем.

Предварительно надо оставить проверку наличие price и lot, и если нет их - добавлять.
 
  • Нравится
Реакции: Iga
у вас там на 50-й строке
Код:
$(document).on('input',function(){
то есть это срабатывает на любой ввод пользователя в любом месте документа.
выше на 23-й есть привязка к полю facetwp-number-max, а тут почему-то нет
Код:
$(document).on('input','.facetwp-number-max',function(){

при этом строкb 41 и 70
Код:
let timer = null;
setTimeout(set_filter, 2000);
по идее, должны отменять таймер и запускать его заново, но прогер, похоже, забыл вообще объявить эту переменную глобально, да и отменять его простым обнулением неправильно.

должно быть что-то вроде
Код:
clearTimeout(timer);
timer = setTimeout(set_filter, 2000);
 
  • Нравится
Реакции: Iga
у вас там на 50-й строке
Код:
$(document).on('input',function(){
то есть это срабатывает на любой ввод пользователя в любом месте документа.
выше на 23-й есть привязка к полю facetwp-number-max, а тут почему-то нет
Код:
$(document).on('input','.facetwp-number-max',function(){

при этом строкb 41 и 70
Код:
let timer = null;
setTimeout(set_filter, 2000);
по идее, должны отменять таймер и запускать его заново, но прогер, похоже, забыл вообще объявить эту переменную глобально, да и отменять его простым обнулением неправильно.

должно быть что-то вроде
Код:
clearTimeout(timer);
timer = setTimeout(set_filter, 2000);
Это всё вроде убрало основные глюки. Большое спасибо за советы.
Единственное что отловил ещё, это в IE в адресе постоянно моргает
Код:
/?fwp_price_facet=%2C
и, видимо оно же, не даёт комфортно вбивать цифры в поле, сбрасывает курсор оттуда.
 
Это всё вроде убрало основные глюки. Большое спасибо за советы.
Единственное что отловил ещё, это в IE в адресе постоянно моргает
Код:
/?fwp_price_facet=%2C
и, видимо оно же, не даёт комфортно вбивать цифры в поле, сбрасывает курсор оттуда.

можно попробовать вернуть курсор туда, где был, но я, если честно, вообще не понимаю, зачем вся эта возня. Вы так хотите, чтобы клиент мог делать закладку именно с вот этим содержимым фильтров, при этом ни разу не нажав Submit?
 
чтобы клиент мог делать закладку именно с вот этим содержимым фильтров
Нет, тут дело в удобстве. Там по умолчанию около цены и около id есть кнопки submit и есть общая кнопка submit.
Получается, для того, чтобы с главной страницы отсортировать по цене, посетителю нужно ввести цену, затем нажать submit для цены, а потом нажать общий submit. Как-то не очень юзер-френдли.
 
Назад
Сверху