serii81
@serii81
Я люблю phр...

Как правильно повесить обработчик на изменения окна браузера?

У меня есть меню.
Я написал функцию, которая отрабатывает, когда окно браузера меньше 520px.

Все работает.

Но, если, уменьшить окно в режиме разработчика, то меню не открывается.
Если перезагружаю страницу, то все уже работает.

$(function () {
  /*
      https://www.jqueryscript.net/animation/Smooth-Mouse-Wheel-Scrolling-Plugin-With-jQuery-easeScroll.html
      ===========================*/
  $("html").easeScroll({
    frameRate: 60,
    animationTime: 1000,
    stepSize: 90,
    pulseAlgorithm: 1,
    pulseScale: 8,
    pulseNormalize: 1,
    accelerationDelta: 20,
    accelerationMax: 1,
    keyboardSupport: true,
    arrowScroll: 50,
    touchpadSupport: true,
    fixedBackground: true
  });

  let sandwitch = function () {
    let mainMenuList = $('.main-menu-list');

    if ($(window).width() < 520) {
      $(document).on('click', '.sandwitch', function () {
        $(this).toggleClass('sandwitch--active');
        mainMenuList.slideToggle();
      });
    }
  };

  let galleryPopup = function(){
    $('#js-gallery').magnificPopup({
      delegate: 'a', // child items selector, by clicking on it popup will open
      type: 'image',
         // Delay in milliseconds before popup is removed
      removalDelay: 600,

      // Class that is added to popup wrapper and background
      // make it unique to apply your CSS animations just to this exact popup
      mainClass: 'mfp-fade'
    });

  };

  sandwitch();
  galleryPopup();
});


let sandwitch = function () {
  let mainMenuList = $('.main-menu-list');

  if ($(window).width() < 520) {
    $(document).on('click', '.sandwitch', function () {
      $(this).toggleClass('sandwitch--active');
      mainMenuList.slideToggle();
    });
  }
};

$(window).on('resize', function(){
 sandwitch();
});


После того как добавил $(window).on('resize)), при клике на меню, оно открывается и закрывается раз 20 подряд.

Где я накосячил?
  • Вопрос задан
  • 154 просмотра
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
При каждом ресайзе у вас вызывается sandwitch, в котором назначается обработчик клика. Отресайзили окно 10 раз - вот вам 10 обработчиков.

Не очень понятно, зачем вообще тут нужно отслеживать ресайз - вешайте обработчик сразу, и уже внутри него проверяйте ширину окна, как-то так:

$(document).on('click', '.sandwitch', function () {
  if ($(window).width() < 520) {
    $(this).toggleClass('sandwitch--active');
    $('.main-menu-list').slideToggle();
  }
});
Ответ написан
potapchino
@potapchino
;(function(){
  function toggleMenu() {
    if ($(window).width() < 520) {
      $('.sandwitch').toggleClass('sandwitch--active');
      $('.main-menu-list').slideToggle();
    }
  }

  function bindEvents() {
    $(document).on('click', '.sandwitch', toggleMenu);
  }

  function init() {
    toggleMenu()
    bindEvents()
  }

  init()
})();
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@andreysuha
Что то знаю
При каждом ресайзе добавляется обработчик
$(document).on('click', '.sandwitch', function () {
      $(this).toggleClass('sandwitch--active');
      mainMenuList.slideToggle();
    });


Вам нужно или использовать флаг который будет указывать на то есть уже обработчик клика или нету или каждый раз вызывать
$(document).off('click', '.sandwitch')
Перед тем как навесить обработчик.

Надеюсь я Вас не запутал))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы