@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')
	})
})
  • Вопрос задан
  • 205 просмотров
Решения вопроса 2
Robur
@Robur
Знаю больше чем это необходимо
Можно, но на hide надо этот обработчик удалять. иначе при каждом открытии у вас будет добавляться новый обработчик, и они все будут вызываться на закрытие. В вашем случае вы вряд ли увидите какие-то реальные проблемы, но это неправильно. поставьте рядом с removeClass console.log и откройте-закройте несколько раз - увидите в чем проблема.

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

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

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

Войти через центр авторизации
Похожие вопросы