D
D
Dima Pautov2015-10-15 15:23:58
JavaScript
Dima Pautov, 2015-10-15 15:23:58

How can I improve my function?

Hello! I have different drop-down blocks in my layout when I click on a button.
So I hang the block opening event

$('button').on('click', function(){
  $(this).toggleClass('act');
  $('div').toggleClass('act');
});


And so, I hide the block, when clicking outside it:
$(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);
  });


Everything works as it should. But there was a desire to somehow rewrite or improve the code, because after looking after, I realized that somehow it looks like shit code! Help with advice or, if possible, show your ideas directly on my example. I would be very grateful

Answer the question

In order to leave comments, you need to log in

2 answer(s)
D
Dasha Tsiklauri, 2015-10-15
@dasha_programmist

do caching and do not do unnecessary operations! why look for elements of the same type on each click, or why redefine a function that does not change the logic on each click? it can be done once and then called.

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);
  });

S
Stalker_RED, 2015-10-15
@Stalker_RED

The simplest example of a modal window: jsfiddle.net/ph8zd19j/1
Instead of creating 100500 different popup blocks, you can copy them inside one #modal
I can sketch an example.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question