Как объединить функции и классы?
Ребята, подскажите, можно ли объединить три функции в один скрипт? Они фактически идентичны, выполняют одинаковые функции, но для разных блоков. Если писать еще такие, то получится много строк текста. Подскажите, как сократить код?
// добавление класса во фронт $(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); }); }); |
Очевидное решаение - простой цикл:
$(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" содержащий селектор для цели. |
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'); |
Aetae,
пока всего три функции, но возможно их скоро станет больше, поэтому озадачился... В любом случае, хотя бы кода меньше будет |
Ребята, спасибо. Подойдет.
|
$(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); }); }); }); |
j0hnik, тож самое что и у меня, но не так няшно.)
|
Aetae,
да, не по феншую, но компактней. что означают эти магические цифры? 29375, 35 |
j0hnik,
это где вы их нашли?) |
j0hnik, если разгадаешь - будешь разочарован.)
|
Aetae,
разочарован??? хм... это что то обидное |
Ага, три буквы. :)
(...нет, не те) |
держусь за голову как чувак на аватарке
|
От всех этих обьектов и функций толку никакого, поскольку они видны только в пределах своего блока $(function() {});
А вот обьект jQuery виден везде, потому к нему и надо присоединить новый пользовательский метод. В jQuery это делается так: $.fn.userMethod = function() { ... }; Конкретно для этой темы: $(function() { $.fn.classToggler = function(target, cls) { $(this).click(function() { let clss = cls || $(this).data('cls'); $(target).toggleClass(clss); }); }; }); $(function() { $('.btn_cls').classToggler('.front'); }); $(function() { $('.btn_dis_cls').classToggler('#display', 'blue'); }); Второй аргумент cls опциональный для того, чтобы расширить функциональность нового метода - если понадобится работать с другим классом, а не с тем, что указан в data. |
Согласен. Я уже давно не использую jquery и многое подзабыл. Тем те менее, этот вариант работает, по крайней мере у меня в хроме.
|
Нашел где. Наверняка это код от домофона или дата конца света , хотя я еще не понял, что означают последние 35
|
Нет, это три английских символа, читающиеся как два русских.)
|
Часовой пояс GMT +3, время: 20:21. |