Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как объединить функции и классы? (https://javascript.ru/forum/dom-window/74872-kak-obedinit-funkcii-i-klassy.html)

madeas 13.08.2018 16:37

Как объединить функции и классы?
 
Ребята, подскажите, можно ли объединить три функции в один скрипт? Они фактически идентичны, выполняют одинаковые функции, но для разных блоков. Если писать еще такие, то получится много строк текста. Подскажите, как сократить код?

// добавление класса во фронт
      $(function() {
        var b = $('.btn_cls');
        b.click(function() {
          var cls = $(this).data('cls');
          $('.front').toggleClass(cls);
        });
      });

      // добавление класса в блок
      $(function() {
        var b = $('.bSd_cls');
        b.click(function() {
          var cls = $(this).data('cls');
          $('.bSd').toggleClass(cls);
        });
      });

      // убрать/добавить display
      $(function() {
        var b = $('.btn_dis_cls');
        b.click(function() {
          var cls = $(this).data("cls");
          $('#display').toggleClass(cls);
        });
      });

Aetae 13.08.2018 16:56

Очевидное решаение - простой цикл:
$(function() {
  [
    {
      element: '.btn_cls',
      target:  '.front'
    },{
      element: '.bSd_cls',
      target:  '.bSd' 
    },{
      element: '.btn_dis_cls',
      target:  '#display'
    }
  ].forEach(function(item){
    $(item.element).click(function() {
      var cls = $(this).data('cls');
      $(item.target).toggleClass(cls);
    })
  });
});
Но удобнее если таких элементов много - сделать глобальный обработчик и сделать некую связь меж целевыми элементами. Примерно так:
$(function() {
  $( "body" ).on( "click", ".toggle-target", function() {
    var cls = $(this).data('cls');
    var target = $(this).data('target');
    $(target).toggleClass(cls);
  });
});
Где каждому элементу, реагирующему на клик прописывается дополнительный класс "toggle-target", а также атрибут "data-target" содержащий селектор для цели.

Nexus 13.08.2018 16:58

function func(controller, target) {
    $(controller).click(function() {
        $(target).toggleClass(
            $(this).data('cls')
        );
    });
};

func('.btn_cls','.front');
func('.bSd_cls','.bSd');
func('.btn_dis_cls','#display');

madeas 13.08.2018 17:00

Aetae,
пока всего три функции, но возможно их скоро станет больше, поэтому озадачился... В любом случае, хотя бы кода меньше будет

madeas 13.08.2018 17:12

Ребята, спасибо. Подойдет.

j0hnik 13.08.2018 20:05

$(function() {
	[['.btn_cls','.front'],
	['.bSd_cls','.bSd'] ,
	['.btn_dis_cls','#display']].forEach(function(item){
		$(item[0]).click(function() {
			var cls = $(this).data('cls');
			$(item[1]).toggleClass(cls);
		});
	});
});

Aetae 13.08.2018 21:00

j0hnik, тож самое что и у меня, но не так няшно.)

j0hnik 14.08.2018 00:06

Aetae,
да, не по феншую, но компактней.
что означают эти магические цифры? 29375, 35

madeas 14.08.2018 08:45

j0hnik,
это где вы их нашли?)

Aetae 14.08.2018 09:58

j0hnik, если разгадаешь - будешь разочарован.)


Часовой пояс GMT +3, время: 16:00.