События JQuery и двойная стрельба? - PullRequest
1 голос
/ 10 декабря 2011

Когда я динамически загружаю JQuery с помощью AJAX, элементы с существующими событиями запускаются несколько раз.

По сути, у меня есть один файл с именем 'myjs.js', в котором хранится весь мой JQuery, и он включается при загрузке страницы, поэтому настраивает события и тому подобное для элементов.

Теперь, когда пользователь запускает событие, например, публикует новый комментарий, он отправляет (через Ajax) комментарий, затем возвращает страницу с новым комментарием, редактирует комментарий, отвечает и т. Д. Очевидно, когда myjs.js был впервые загружен это не создавало никаких событий для недавно загруженных элементов. Поэтому я включаю myjs.js на страницу, возвращенную с AJAX.

Поскольку myjs.js уже загружен вместе со страницей, когда страница Ajax возвращается с включенным myjs.js, он добавляет еще одно событие к элементам, уже загруженным со страницей.

Я уже пробовал

$('*').unbind();

Но это вызвало некоторые странные эффекты.

Итак, есть ли идеи по динамической загрузке JQuery, не затрагивая события, которые уже существуют для элементов?

1 Ответ

2 голосов
/ 10 декабря 2011

Не видя код jQuery, я подозреваю, что селекторы, используемые для привязки поведения, слишком универсальны, так что, как вы обнаружили, все существующие элементы плюс вновь загруженные элементы сопоставляются каждый раз:

Вы можете использоватьболее конкретная привязка в JavaScript, возвращаемая в ответе AJAX, для добавления поведения только к вновь загруженным элементам.

Однако возвращать один и тот же JavaScript для каждого запроса AJAX неэффективно, поскольку браузер не может кэшировать,В идеале вы должны попытаться загрузить JavaScript на главной странице один раз, а затем положиться на jQuery, чтобы автоматически связывать .live() для вновь загруженных элементов.Это также известно как делегирование событий - .delegate()

Обратите внимание, что с jQuery 1.7 эти методы устарели в пользу более краткой инфраструктуры привязки событий - .on()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...