jQuery UI Автозаполнение не вызывает поиск при вводе досконально искомого термина - PullRequest
5 голосов
/ 18 октября 2010

У меня есть элемент управления автозаполнением пользовательского интерфейса jQuery, который запускает запрос Ajax, когда minLength = 3. Проблема заключается в следующем: скажем, я ввел «fic» в качестве начального условия поиска - это нормально.Запрос запускается и результаты возвращаются.Я решаю, что не хочу выбирать какие-либо результаты, а затем снова ввожу тот же поиск снова (fic).На этот раз запрос Ajax не сработал!

Мой код показан ниже:

// ... do request
$("#reportSearch").autocomplete({
    delay: 50,
    minLength: 3,
    source: function(q, add){
        $.ajaxSetup ({ cache: false});              
        $.ajax({
            type: "GET",
            url: K_URL_REQUEST

Таким образом, обратный вызов «источника» не запускается во втором сценарии, который я описал выше.Похоже, что причиной этого было то, что элемент управления автозаполнения удерживал предыдущий поисковый термин и, поскольку он соответствовал - не запускал поиск:

// Taken from jquery-ui-1.8.4.custom.min.js
if (a.term != a.element.val()) { // *** THE MATCH IS HERE
    //console.log("a.term != a.element.val(): "+a.term+", "+a.element.val());
    a.selectedItem = null;
    a.search(null, c) // *** SEARCH IS TRIGGERED HERE
}

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

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

Так что, хотя я исправил свою проблему, я чувствую, что что-то здесь упустил.

Любые идеи кто-нибудь?Заранее спасибо!

Ответы [ 5 ]

7 голосов
/ 12 сентября 2011

Вместо изменения jquery.ui, вы можете попробовать стереть значение свойства «предыдущий», выполнив что-то вроде этого:
$ (this) .data (). autocomplete.previous = null;

6 голосов
/ 15 апреля 2011

Мне удалось решить эту проблему, закомментировав это if-утверждение в источнике автозаполнения jquery ui.

// keypress is triggered before the input value is changed
clearTimeout( self.searching );
self.searching = setTimeout(function() {
    // only search if the value has changed
    //if ( self.term != self.element.val() ) {
        self.selectedItem = null;
        self.search( null, event );
    //}
}, self.options.delay );
6 голосов
/ 10 марта 2011

Я нашел решение этой проблемы (для информации, я использую jQuery UI 1.8.4)

Реализация автозаполнения в jquery-ui-1.8.4.custom.js имеет метод, определенный как _change. Комментируя оператор if , элемент управления всегда отправляет запрос.

...,
_change: function(event) {
    //if (this.previous !== this.element.val()) {
        this._trigger("change", event, { item: this.selectedItem });
    //}
},
...
1 голос
/ 21 июля 2015

Начиная с JQuery UI 1.8+, вы можете использовать фабрику виджетов, чтобы расширить поведение по умолчанию для всех ваших виджетов автозаполнения.Просто включите файл javascript с этим содержимым после jqueryUI

// Extend jquery UI autocomplete
$.widget( "ui.autocomplete", $.ui.autocomplete, {
    _close: function( event ) {
        var ret = this._super();

        // Resets previously used search term
        this.term = null;

        return ret;
    }
});
0 голосов
/ 11 октября 2012

Хорошие советы здесь - это то, с чем я долго боролся.

Для меня единственное решение, которое последовательно работает, - это сочетание ответов Дункана и Стефаана выше.

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