Почему выполняется JS код многократно?

205
29 марта 2017, 17:14

Код у меня получился рабочий, но меня смущает то, что в консоле выполняется многократное действия:

При разрежении экрана больше 768 пикселей плагин инициализируется, если меньше 768 пикселей то код не выполняется (дестрой):

const searchLeftContent = $(".search-left-content");
(checkAndRepaint)();
window.onresize = checkAndRepaint;
function checkAndRepaint() {
    if ($(window).width() >= 768) {
        // Инициализация плагина
        searchLeftContent.mCustomScrollbar({
            theme: "dark-3"
        });
        console.log('Initial');
    } else {
        // Дестрой плагина
        searchLeftContent.mCustomScrollbar("destroy");
        console.log('destroy');
    }
}

Я специально поместил код console.log('Initial'); что бы было ясно сколько раз выполняется действия скрипта - http://joxi.ru/V2Ve6qVfyv9Ymv меня смущают цифры, они возникают тогда когда я меняю размер окна браузера. Подскажите правильно ли написан скрипт?

PS. Тут можно посмотреть работу скрипта http://test.buyhtml.ru/result.html

Answer 1

Чтобы улучшить производительность, рекомендую вам воспользоваться функцией debounce. Таким образом, если вы потянете окошко, то функция не будет вызвана много раз подряд и не нагрузит браузер почём зря, она выполнится один раз после того, как пройдёт 250 мс после события resize.

const searchLeftContent = $(".search-left-content"); 
var dbCheckAndRepaint = debounce(checkAndRepaint, 250); 
 
(checkAndRepaint)(); 
window.onresize = dbCheckAndRepaint; 
 
function checkAndRepaint() { 
  if ($(window).width() >= 768) { 
 
    // Инициализация плагина 
    /*searchLeftContent.mCustomScrollbar({ 
        theme: "dark-3" 
    });*/ 
 
    console.log('Initial'); 
  } else { 
    // Дестрой плагина 
    //searchLeftContent.mCustomScrollbar("destroy"); 
    console.log('destroy'); 
  } 
} 
 
function debounce(func, wait, immediate) { 
  var timeout; 
  return function() { 
    var context = this, 
      args = arguments; 
    var later = function() { 
      timeout = null; 
      if (!immediate) func.apply(context, args); 
    }; 
    var callNow = immediate && !timeout; 
    clearTimeout(timeout); 
    timeout = setTimeout(later, wait); 
    if (callNow) func.apply(context, args); 
  }; 
};
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

READ ALSO
сохранение проверки значения для input

сохранение проверки значения для input

есть небольшой плагин для проверки вводадля input например

247
Проблема с селекторами

Проблема с селекторами

У нас есть n-блоков !В каждом есть селекторная выборка!Проблема в том что если я выбираю из списка в 1 блоке , то значения передаються и всем...

221
Добавление текста из полей input в textarea jquery

Добавление текста из полей input в textarea jquery

Совершенно недавно начал изучать руби и jqueryСтолкнулся с проблемой вроде все просто, но что-то не получается

309
Обработчик по нажатию кнопки, который в базе данных поменяет значение jquery

Обработчик по нажатию кнопки, который в базе данных поменяет значение jquery

Необходимо при нажатии так скажем поменять время в таблице на Timenow

209