@softshape

Как удалить «сиротские» обработчики событий jQuery?

Есть модальный диалог, содержимое в который подкачивается с сервера при его открытии. В содержимом может быть не только HTML, но и скрипты. Например, вот такой -

$(document).on('click', '.modal-content a.select', function(e) {
	e.preventDefault();
	var src = $(this).attr('href');  alert(src);
....
    });


При закрытии окна диалога его содержимое очищается - $('#dialog').html('');

Если открыть, закрыть и снова открыть окно диалога, то обработчик клика будет вызван два раза! alert(src) это позволяет увидеть. Если снова закрыть-открыть, то уже три раза, и так далее.

При том, что собственно сам код уничтожается, его привязка к обработчику 'click' остается и каждый раз добавляется снова.

Да, в jQuery есть detach(). Проблема в том, что окно диалога о его внутренней жизни ничего не знает и detach() вызвать не сможет. Есть ли другие способы удалить привязку к событию, когда его функция-обработчик физически удаляется из DOM?
  • Вопрос задан
  • 390 просмотров
Решения вопроса 2
erniesto77
@erniesto77
oop, rb, py, php, js
еще вариант чтобы клик не обрабатывался более 1 раза
$(document).on('click', '.modal-content a.select', function(e) {
  e.preventDefault();
  e.stopPropagation();
  e.stopImmediatePropagation();

  var src = $(this).attr('href');  alert(src);
....
    });
Ответ написан
Комментировать
@AndryG
$(document).on('click', '.modal-content a.select', function(e) {

Вы обработчик вешаете на документ и висеть он будет до перезагрузки страницы.
e.stopPropagation() останавливает выполнение, но память скрипт жрет.
Навешивайте обработчик на элемент, который удалится при закрытии модального окна.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
$('#dialog').empty();
вместо
$('#dialog').html('');
Ответ написан
Ваш ответ на вопрос

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

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