Задать вопрос

Как один раз привязать событие в одностраничном приложении?

Есть одностраничное приложение на котором происходит разные манипуляции с элементами, к примеру удаление.

Использую стандартную привязку функции к элементу на какое-то событие.
Но элементы на странице могут меняться и тут возникает проблема:
1. Если делать привязку вида:
var el1=jQuery('.el1');
el1.on('click', function() {
  console.log('element1');
})

То такое событие соответственно работает пока мы не сменили элементы. То есть убрали старый el1 и добавили новый el1.

2. Если делать привязку:
jQuery(document).on('click', '.el1', function() {
  console.log('element1');
})

То такое событие будет срабатывать даже после замены элементов, но после каждой смены элементов, будет привязываться новый обработчик и в итоге команда будет выполнятся два раза (столько, сколько раз привязался новый обработчик).

Можно вначале привязки делать отвязку от события:
jQuery(document).off('click', '.el1');
jQuery(document).on('click', '.el1', function() {
  console.log('element1');
})

Есть ли какой-нибудь другой способ решить данную проблему?
  • Вопрос задан
  • 2605 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
GM2mars
@GM2mars Автор вопроса
Спасибо за ответы, видимо нет простого способа стандартными средствами библиотеки, решить данную проблему.
Не люблю фреймворки, использую только в крайней необходимости, а только ради одной функции и подавно не вижу в них смысла.
Тогда придется использовать (отвязка - привязка).
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Вариант для ленивых: использовать готовый фреймворк (AngularJS, Backbone и т.д. которые либо полностью решают такие проблемы (директивы в агнуларе) либо предоставляют возможность отслеживать изменения (например у вас рендрится вьюшка - вы биндите события, она уничтожается - отвязываетесь ну или забиваете. Если у вас там списки - можно контролировать это все до элементов списка и т.д. В Angularjs через создание/уничтожение скоупа, который привязан к элмент).
Ответ написан
Комментировать
cornerJS, polymer/x-tags
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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