Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.08.2018, 16:37
Аватар для madeas
Профессор
Отправить личное сообщение для madeas Посмотреть профиль Найти все сообщения от madeas
 
Регистрация: 13.04.2018
Сообщений: 232

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

// добавление класса во фронт
      $(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);
        });
      });
Ответить с цитированием
  #2 (permalink)  
Старый 13.08.2018, 16:56
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

Очевидное решаение - простой цикл:
$(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" содержащий селектор для цели.
__________________
29375, 35

Последний раз редактировалось Aetae, 13.08.2018 в 17:03.
Ответить с цитированием
  #3 (permalink)  
Старый 13.08.2018, 16:58
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,724

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');
Ответить с цитированием
  #4 (permalink)  
Старый 13.08.2018, 17:00
Аватар для madeas
Профессор
Отправить личное сообщение для madeas Посмотреть профиль Найти все сообщения от madeas
 
Регистрация: 13.04.2018
Сообщений: 232

Aetae,
пока всего три функции, но возможно их скоро станет больше, поэтому озадачился... В любом случае, хотя бы кода меньше будет
Ответить с цитированием
  #5 (permalink)  
Старый 13.08.2018, 17:12
Аватар для madeas
Профессор
Отправить личное сообщение для madeas Посмотреть профиль Найти все сообщения от madeas
 
Регистрация: 13.04.2018
Сообщений: 232

Ребята, спасибо. Подойдет.
Ответить с цитированием
  #6 (permalink)  
Старый 13.08.2018, 20:05
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

$(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);
		});
	});
});
Ответить с цитированием
  #7 (permalink)  
Старый 13.08.2018, 21:00
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

j0hnik, тож самое что и у меня, но не так няшно.)
__________________
29375, 35
Ответить с цитированием
  #8 (permalink)  
Старый 14.08.2018, 00:06
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Aetae,
да, не по феншую, но компактней.
что означают эти магические цифры? 29375, 35
Ответить с цитированием
  #9 (permalink)  
Старый 14.08.2018, 08:45
Аватар для madeas
Профессор
Отправить личное сообщение для madeas Посмотреть профиль Найти все сообщения от madeas
 
Регистрация: 13.04.2018
Сообщений: 232

j0hnik,
это где вы их нашли?)
Ответить с цитированием
  #10 (permalink)  
Старый 14.08.2018, 09:58
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

j0hnik, если разгадаешь - будешь разочарован.)
__________________
29375, 35
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обработать переданные функции параметры как массив? javascript_pupil Общие вопросы Javascript 7 19.08.2016 13:59
Как объединить 3 функции в одну? Андрей Розумович Общие вопросы Javascript 9 20.10.2015 12:36
Как заставить выполняться функции друг за другом Moloch Общие вопросы Javascript 1 16.08.2015 07:53
Как добавить данные в глобальный массив из функции Jigan2 jQuery 2 14.03.2015 18:06
Как скрыть содержимое функции? ananax Общие вопросы Javascript 3 17.01.2013 09:28