Как можно укоротить такую конструкцию?

169
14 апреля 2017, 21:54

Всем доброго времени! У меня получается вот такая вынужденная конструкция:

$(document).ready(function() {
  $('.sidebar_icon').click(function(e){
    e.preventDefault();
    $('.sidebar').toggleClass('sidebar_toggled');
    $('.sidebar_bg').toggleClass('sidebar_bg_toggle');
    $('.sidebar_icon-close').toggleClass('icon-close-active');
    $('.wrapper').toggleClass('wrapper_push');
    $('body').toggleClass('site-cache');
  });
  $('.sidebar_bg_toggle').click(function(e){
    e.preventDefault();
    $('.sidebar').removeClass('sidebar_toggled');
    $('.sidebar_bg').removeClass('sidebar_bg_toggle');
    $('.sidebar_icon-close').removeClass('icon-close-active');
    $('.wrapper').removeClass('wrapper_push');
    $('body').removeClass('site-cache');
  });
});

Наверное, все же это не совсем красиво. Возможно ли такую конструкцию скорректировать в плане уменьшения кода? Благодарю!

Answer 1

Мне кажется, что укорачивание подобных конструкций, скорее приведет к ухудшению читаемости. Но поскольку переключаемые пары селектор-класс в обоих случаях одинаковы, то можно попробовать написать универсальный метод. Например, такой:

  $('.sidebar_icon, .sidebar_bg_toggle').click(function(e){
    e.preventDefault();
    var tdata = { 
            ".sidebar":    "sidebar_toggled",
            ".sidebar_bg": "sidebar_bg_toggle", 
            ".sidebar_icon-close": "icon-close-active",
            ".wrapper":    "wrapper_push",
            "body":        "site-cache"
        };
    var remove = $(this).hasClass("sidebar_bg_toggle");
    $.each(tdata, function(sel, cls){
        remove ? $(sel).removeClass(cls) : $(sel).toggleClass(cls);     
    });    
  });  

можно removeClass заменить на toggleClass(..., false) и попробовать еще упростить, но с другой стороны это в одном месте упростит, в другом усложнит. Т.е внутри цикла это упростит: $(sel).toggleClass(cls, state), но необходимо будет определить текущее состояние state в зависимости от того, какая кнопка нажата. И если в одному случае там всегда будет false, то во втором необходимо получить текущее наличие класса. Что в конечном счете, если классы могут как то независимо меняться, приведет скорее к путанице.

READ ALSO
Как сделать обработку свойства товаров

Как сделать обработку свойства товаров

Добрый день, такой вопрос нашел данные товаров таобао, выводится в json но понятие не имеею как делать обработку свойства товаров например...

189
Как можно нарисовать фигуры на css?

Как можно нарисовать фигуры на css?

Привет всем, Как я могу нарисовать на css что-то подобное на этом рисунке?

204
Ошибка при установке pip3 install mysql-python

Ошибка при установке pip3 install mysql-python

Только на днях использовал данную библиотеку - всё было нормально, но столкнулся с тем, что пришлось переустановить ОС

224
Не работает слово в выборке MySQL

Не работает слово в выборке MySQL

ЗдравствуйтеПри выборке (через CRON проверка актуальности записи) столкнулся с непонятностью

175