@nikolay_akhmetyanov
Front-end developer

Можно ли назначать обработчик события внутри другого обработчика?

Нужно добавить класс кнопке при открытии модального окна и удалить класс после закрытия. Можно ли назначить обработчик закрытия окна внутри обработчика открытия? Код ниже работает, но насколько он верный?

$('#gp-advantages_01-modal').on('show.bs.modal', function (event) {
	var button = $(event.relatedTarget) // Button that triggered the modal
	button.addClass('active')
  var textModal = button.data('text-modal')
  var titleModal = button.data('title-modal') // Extract info from data-* attributes
  // If necessary, you could initiate an AJAX request here (and then do the updating in a callback).
  // Update the modal's content. We'll use jQuery here, but you could use a data binding library or other methods instead.
  var modal = $(this)
  modal.find('.modal-title').text(titleModal)
	modal.find('.modal-body').text(textModal)
	$('#gp-advantages_01-modal').on('hidden.bs.modal', function (e) {
		button.removeClass('active')
	})
})
  • Вопрос задан
  • 236 просмотров
Решения вопроса 2
Robur
@Robur
Знаю больше чем это необходимо
Можно, но на hide надо этот обработчик удалять. иначе при каждом открытии у вас будет добавляться новый обработчик, и они все будут вызываться на закрытие. В вашем случае вы вряд ли увидите какие-то реальные проблемы, но это неправильно. поставьте рядом с removeClass console.log и откройте-закройте несколько раз - увидите в чем проблема.

но насколько он верный?

Зачем вы так делаете вообще? что мешает навешать сразу два обработчика на открытие и закрытие и все?
Ответ написан
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Технически можно, но каждое открытие модалки будет навешивать ещё один обработчик события. В данном случае ничего не сломается, просто N раз будет происходить попытка удаления класса у кнопки, но вообще так делать не стоит. Однако, если вы поставите обработчик при помощи .one(), проблема исчезнет.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы