Jquery datatables несколько вызовов обработчику событий с функцией live

Я использую jquery datatables для отображения некоторых данных. В каждой строке есть кнопка редактирования, для которой я регистрирую обработчик щелчка с помощью live(), так что он работает с разбиением на страницы. Я делаю это по классу, так как я должен делать это для каждой строки. Что-то вроде: Datatables с функцией события click click

Это прекрасно работает. Но проблема возникает, когда пользователь выполняет поиск снова, и я делаю запрос ajax для получения нового набора результатов.

Я просто заменю существующую таблицу в dom новой. Теперь, когда я нажимаю на строку 1, появляется диалоговое окно редактирования для строки 1. Я нажимаю на строку 2, она открывает диалоговое окно редактирования для строки 1. Я снова нажимаю на строку 2, и на этот раз он открывает диалоговое окно редактирования для строки 2.

Затем я снова и снова нажимаю на строку 3. Он открывает диалоговое окно редактирования для строки 2 трижды, прежде чем отобразит диалог для строки 3.

Это продолжает расти. Я не понимаю, если я заменяю весь dataTable в div с помощью jquery, почему он должен регистрировать несколько событий?

В случае, если это имеет значение, у меня есть autoopen, установленное false в моем инициализаторе диалога, и я явно открываю и закрываю его.

Изменить (Подробнее):

Мне сложно создать пример... но более подробно... Я понял, что, поскольку я использую функцию live() для регистрации вызовов через разбиение на страницы, существует механизм регистрации кликов. Поэтому, когда я заменяю таблицу той же структурой, функция щелчка регистрируется из-за первого вызова live(). Но я делаю еще один звонок для live() по умолчанию, и теперь регистрируются два события кликов. Затем, когда я заменяю снова, регистрируются три клика за события. Я попытался преодолеть это, зарегистрировав события с помощью jquery click() после проверки того, что событие click уже зарегистрировано. Помогает с частью нескольких событий, но не регистрирует события на страницах с данными datatables.

Ответ 1

Исправлена ​​проблема

Проблема заключалась в том, что я не мог просто зарегистрировать событие click для элементов в строках данных. События не будут регистрироваться на страницах с данными.

С помощью live() для регистрации событий и изменения на странице события будут автоматически регистрироваться.

Но для моего использования, которое привело к другой проблеме каждый раз, когда я выполнял поиск, я бы заменил datatable на новый. Новый тип данных будет регистрироваться для этих событий снова. Таким образом, это означает, что для одного и того же элемента вызывается несколько обработчиков. Поскольку функция live() вызывалась дважды в одном классе, и jquery не должен сравнивать, являются ли два обработчика обратного вызова одинаковыми.

Я повернул в другом направлении и попытался зарегистрировать события кликов, используя .click() вместо .live() при изменении страницы, используя событие страницы (http://datatables.net/docs/DataTables/1.9.beta.1/#page_details). Это не помогло с тех событий, когда событие изменения страницы было вызвано до того, как содержимое было обновлено с событиями на новой странице.

Я также попытался использовать click() вместо live() и привязать клик, только если он еще не был зарегистрирован с использованием приведенного здесь примера fooobar.com/questions/39480/.... Этот метод работал с заменой таблицы, но не на нескольких страницах.

В конечном итоге я нашел функцию .die(). Я вызываю его, прежде чем вызвать функцию live(). Вызов live() гарантирует, что обработчики событий регистрируются при изменении страницы, в то время как вызов die() гарантирует, что я отменил регистрацию событий live(), сделанных ранее для элементов этого класса. Я избегаю нескольких вызовов функции live() таким образом.

Ответ 2

У вас была эта проблема с живыми и ajax. То, что я закончил, - это перерегистрировать событие, на которое нажимают на получение ответа ajax. Без примера трудно рекомендовать решение, но идея состоит в том, чтобы прикрепить события кликов к загрузке страницы, используя bind/click (для отображения по умолчанию/начальный), а затем снова зарегистрировать события кликов на успешном ответе ajax. Конечно, размещение кода привязки событий в многоразовом компоненте, таком как функция, поэтому его можно легко вызвать.