bootd
@bootd
Гугли и ты откроешь врата знаний!

Как можно улучшить мою функцию?

Всем привет! У меня в макете есть разные выпадающие блоки, при клике на кнопку.
Так вешаю событие открытия блока
$('button').on('click', function(){
	$(this).toggleClass('act');
	$('div').toggleClass('act');
});


А так, скрываю блок, при клике за его пределами:
$(document).on('click', function(event){
		var target = event.target;

		var closeByDocument = function(docTarget, butTrigger, triggerElem, removeClass, butTriggerBullClass){
			// docTarget - Элемент, при клике по документу
			// butTrigger - Кнопка открытия элемента
			// triggerElem - Открытие блока, при нажатии на кнопку
			// removeClass - Имя удаляемого класса с блока и кнопки
			// butTriggerBullClass - Удалять ли класс у кнопки 

			if(docTarget !== $(triggerElem)[0] && !$(triggerElem).has(docTarget).length && docTarget !== $(butTrigger)[0] && !$(butTrigger).has(docTarget).length){
				$(triggerElem).removeClass(removeClass);

				if(butTriggerBullClass){
					$(butTrigger).removeClass(removeClass);
				}
			}
		};

		// Закроем блок
		closeByDocument(target, 'button', 'div', 'act', true);
	});


Все работает как надо. Но возникло желание как-то переписать или улучшить код, так как глянув после, понял, что как то смахивает на говнокод! Помогите советами или если можно, прям на моем примере показать свои идеи. Был бы очень признателен
  • Вопрос задан
  • 168 просмотров
Пригласить эксперта
Ответы на вопрос 2
dasha_programmist
@dasha_programmist
ex Software Engineer at Reddit TS/React/GraphQL/Go
делайте кэширование и не делайте лишних операций! зачем при каждом клике искать однотипные элементы или зачем при каждом клике переопределять функцию, которая не меняет логику? это можно сделать один раз и потом вызывать.
var divs = $('div');
$('button').on('click', function(){
  $(this).toggleClass('act');
   divs.toggleClass('act');
});

var closeByDocument = function(docTarget, butTrigger, triggerElem, removeClass, butTriggerBullClass){
      // docTarget - Элемент, при клике по документу
      // butTrigger - Кнопка открытия элемента
      // triggerElem - Открытие блока, при нажатии на кнопку
      // removeClass - Имя удаляемого класса с блока и кнопки
      // butTriggerBullClass - Удалять ли класс у кнопки 

      if(docTarget !== $(triggerElem)[0] && !$(triggerElem).has(docTarget).length && docTarget !== $(butTrigger)[0] && !$(butTrigger).has(docTarget).length){
        $(triggerElem).removeClass(removeClass);

        if(butTriggerBullClass){
          $(butTrigger).removeClass(removeClass);
        }
      }
    };
$(document).on('click', function(event){
    var target = event.target;
    // Закроем блок
    closeByDocument(target, 'button', 'div', 'act', true);
  });
Ответ написан
Stalker_RED
@Stalker_RED
Простейший пример модального окна: jsfiddle.net/ph8zd19j/1
Вместо того, чтобы создавать 100500 разных всплывающих блоков, можно копировать их внутрь одного #modal
Могу пример набросать.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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