Автозаполнение jQuery: как обновить список?

У меня есть форма с переменным количеством полей автозаполнения, которые используют тот же список выбора. Эти поля добавляются и удаляются по мере необходимости. Каждый раз, когда параметр на странице изменяется, я (пытаюсь) обновить список для всех полей, сначала вызывая unbind(), затем autocomplete() с новым параметром, добавленным к URL-адресу.

$('input.foo').unbind().autocomplete(url?new_param=bar);

Проблема в том, что unbind (), похоже, не отключает привязку. Когда я набираю поле ввода, запускается вся история событий автозаполнения.

Я также пробовал flushCache, но безрезультатно.

Как очистить старые события?

Спасибо.


person cinematic    schedule 17.10.2009    source источник


Ответы (6)


Попробуй это

$ ('input.foo').unbind('.autocomplete').autocomplete ('url?new_param=bar') ;
person Rubasu    schedule 10.11.2009

Плагин автозаполнения добавляет функцию unautocomplete () для удаления autocomplete () из полей, в которых она есть, поэтому она должна работать, если вы измените свой код на:

$('input.foo').unautocomplete().autocomplete('url?new_param=bar');

Эта функция unautocomplete () должна удалить все старые события.

person Deeksy    schedule 18.10.2009
comment
Привет, спасибо за ответ Дикси. Я пробовал unautocomplete, но это не сработало. Однако я использовал removeData ('events'), и это сработало! $ ('input.foo'). removeData ('события'). autocomplete ('url? new_param = bar'); Обратите внимание, что если вы это сделаете, любые другие события, прикрепленные к этому элементу, будут уничтожены. - person cinematic; 19.10.2009
comment
@cinematic Да, глядя в код плагина автозаполнения, жаль, что они именуют событие 'keydown', но не щелчок, фокус или другие события, которые добавляются во ввод как часть автозаполнения. Если бы они позаботились о том, чтобы продолжить, просто нужно было бы выполнить .unbind ('keypress.autocomplete'). Unbind ('click.autocomplete'). и т.д., хотя я полагаю, что все это должно быть в unautocomplete (). - person Deeksy; 19.10.2009
comment
Приятно ... Спасибо за решение. - person Cesar; 29.10.2009
comment
Это решение приводит к тому, что элементы пропускаются при нажатии клавиши «вниз» в IE при его перезагрузке. - person Yuriy Faktorovich; 23.01.2010
comment
Я бы правильно ответил с рабочим решением, поскольку, похоже, @cinematic заставил его работать. - person KiaMorot; 07.03.2013
comment
Похоже, эта функция была удалена, так как плагин jQuery Autocomplete получил преемника, jQuery UI Autocomplete. - person Yatko; 15.07.2014

jQuery предоставляет метод flushCache () (http://docs.jquery.com/Plugins/Autocomplete ), чтобы удалить уже сопоставленное содержимое с помощью автозаполнения.

Например, если используется элемент html <input type="text" id="txtElement"/> и с ним связано автозаполнение. FlushCache можно указать следующим образом: $("#txtElement").flushCache();, и это решит проблему.

person learningloop    schedule 11.06.2010
comment
Жаль, что это так низко в списке. Ваш совет сработал как шарм. Проголосовал. - person Robert Oschler; 22.06.2011
comment
+1. Метод flushCache работает с данными без очистки настроек. - person Alberto De Caro; 20.11.2012

Если вы используете параметры, добавьте cacheLength и установите для него значение 1. Этот параметр не будет сохранять ни одной из возвращенных записей. Поверьте, это сделало мою жизнь лучше ... за все 5 минут.

person Edwin    schedule 09.11.2010
comment
Для ясности из приведенного выше утверждения: этот параметр не будет хранить какие-либо ПРЕДЫДУЩИЕ возвращенные записи. (Извините!) Будет выполнено новое извлечение записей. - person Edwin; 09.11.2010

Я думаю, ваша проблема в том, что у вас нет формы, включающей поле ввода автозаполнения. Если вы посмотрите код jquery.autocomplete.js, он сделает $ (input.form) .unbind (". Autocomplete"); on unautocomplete (), что означает, что входные данные должны находиться внутри тега формы, чтобы работать.

person Community    schedule 12.02.2010
comment
$ (input.form) не запускается. $ ('input.form') выберет теги ввода с формой класса, например ‹input class = form /›. Я думаю, что вы думаете о $ ('form input'), который будет тегами ввода внутри тегов формы. В любом случае упомянутого выше кода нет в jquery.autocomplete.js - этот ответ неприменим. - person Chris Moschini; 12.04.2011

person    schedule
comment
Этот ответ - текущий способ сделать это. - person Pablo Mescher; 18.06.2012
comment
Это не работает для динамически добавляемых элементов DOM. Этот ответ работает: stackoverflow.com/a/6585109/304209 - person Dennis Golomazov; 22.11.2012
comment
также есть $ (target) .autocomplete (disable); см. api - person montrealmike; 26.02.2013
comment
как проверить, активно ли автозаполнение, перед уничтожением? - person Nikhil VJ; 23.02.2018