@VPank
Бессмертие ради знаний. Знания ради бессмертия.

Не слишком ли жесткий костыль, как правильней записать такой jqyery код?

tooglecloss = function(e) {
                $(".mobile-navigation").animate({
                "width" : "0%" 
            } , 1500 , function(){
                $(".mobile-navigation").css("display","none");
                $(".cmn-toggle-switch").removeClass("active").addClass('not_active');
            });
    };
    
    
    $('.not_active').on('click', function(e) {
        if($(this).hasClass('not_active')) {
                $(".mobile-navigation").animate({
                "width" : "40%" 
            } , 1500 ); 
                $(".cmn-toggle-switch").removeClass("not_active").addClass("active");
                $(".mobile-navigation").css("display", "block");
                $(".active").on('click', tooglecloss );
        }
        else {
            $(".active").off('click', tooglecloss );
        }
    });


Проблема была в том, что после добавления нового класса active, событие на него не привязывалось из-за уже сформированного Dom дерева, а при удалении not_active его собственное событие все равно выполнялось по той-же причине. В итоге я написал такой костыль с проверками классов. Но есть ощущение, что все намного проще должно быть. Кто укажет на ошибки?
  • Вопрос задан
  • 501 просмотр
Решения вопроса 1
inomdzhon92
@inomdzhon92
html, css, js, nodejs
Я бы написал так:
Пусть у внешней и внутренней кнопки будет один класс - js-mobile-nav-toggle. Состояния будет одно active, т.е. по умолчанию оно будет как бы не активным (not_active удаляем).
.mobile-navigation {
  position: fixed;
  left: -100%;
  top: 0;
  width: 380px;
  height: 100%;
  background-color: grey;
}

$('.js-mobile-nav-toggle').on('click', function (evt)  {
  var $mobNav = $('.mobile-navigation');
  var $this = this; // сохраняем текущий контекст. this == js-mobile-nav-toggle, т.е. тому, на что повещено событие
  if ( $mobNav.hasClass('active') ) {
    $movNav.animate({ "left":  0 } , 1500 , function () {
       $mobNav.removeClass('active');
       $($this).removeClass("active");
    });
  } else {
    $movNav.animate({ "left" : "-100%" } , 1500 , function () {
       $mobNav.addClass('active');
       $($this).addClass("active");
    });
  }
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Sanitar88
Студень
ну, not_active вообще не нужен.
Анимацию, если возможно, переписать на css.
Вместо добавлений - удалений класса
.toggleClass("active", state); //state = 0 / 1
Думаю меньше 10 строк будет.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы