Для привязки и разрывания обработчики могут принести неприятности. Гораздо лучше использовать делегированные события.
События отправляются снизу вверх из элементов в дереве DOM. Обработчик событий делегата прикрепляется к контейнеру элементов, которые будут запускать обработанное событие. Когда событие запускается, оно не обрабатывается в самом элементе, но пузырится до тех пор, пока оно не достигнет контейнера, который должен обработать его. Таким образом, контейнер отвечает за обработку события. (Контейнер «знает», какой элемент вызвал событие, поэтому он может решить, обрабатывает он это или нет, в зависимости от селектора).
Если вы выбрали контейнер, который не заменен обновлениями AJAX, вам не нужно беспокоиться о привязке и развязывании обработчиков после обновлений ajax.
Как вы это делаете? Это зависит от версии jQuery.
Раньше .live()
или, предпочтительно .delegate()
.live(): Приложить обработчик события для всех элементов, которые соответствуют текущему селектор, теперь и в будущем. (Устаревший в 1.7, удалить в 1.9)
.delegate(): Прикрепите обработчик к одному или нескольким событиям для всех элементов, которые соответствуют селектору, теперь или в будущем, на основе определенного набора корневых элементов.
Теперь, рекомендуемый способ сделать это является on()
:
.on(): Приложить функцию обработчика событий для одного или нескольких событий для выбранных элементов.
Для использования on()
, вы должны сделать это:
$('container selector').on('event','triggers selector', 'handler')
Например, чтобы использовать функцию clicked
манипулятора все ссылки (a
элементы) внутри DIV с идентификатором navbar
:
$('div#navbar').on('click', 'a', clicked);
Вы можете сделать этот звонок только один раз, и он будет продолжать работать, если navbar div isn Обновлено в обновлениях AJAX. (Если этот div обновлен, выберите внешний элемент, который не является! Вы всегда можете выбрать тело, но лучше всего обращаться с ним как можно ближе к триггеру)
ПРИМЕЧАНИЕ: если вы используете event.stopPropagation()
в любой точке , событие перестает библировать дерево DOM. Если вы не вызываете его, и есть другие делегированные события для одного и того же события, событие будет обработано снова.
ПРИМЕЧАНИЕ. Это также интересно для обработки событий, которые могут запускаться множеством различных элементов. Например, если у вас есть таблица со многими строками, которые имеют несколько ссылок в каждом из них и хотят обрабатывать щелчок по этим ссылкам, лучше привязать один обработчик к таблице, чем привязать триггер для всего этого элементы.
Вам нужно будет предоставить больше своего кода. Недостаточно ответить на ваш вопрос. – JohnFx