Подтвердить что ты не робот

JQueryUI autocomplete - когда результаты не возвращаются

Мне интересно, как можно поймать и добавить пользовательский обработчик, когда пустые результаты возвращаются с сервера при использовании jQueryUI autocomplete.

Похоже, что в этом вопросе есть несколько вопросов, связанных с различными плагинами jQuery (например, jQuery autocomplete отображение сообщения "Нет данных" при отсутствии результатов), но Мне интересно, есть ли лучший/более простой способ достичь этого с автозаполнением jQueryUI.

Мне кажется, что это общий прецедент, и я подумал, что, возможно, что jQueryUI улучшился в автозаполнении jQuery, добавив возможность чисто обрабатывать эту ситуацию. Однако я не смог найти документацию о такой функциональности, и прежде чем я отрублюсь от нее, я бы хотел выбросить некоторые щупальца, если бы другие видели это раньше.

Хотя, вероятно, это не особенно важно, я могу вернуть серверу что-нибудь - например. HTTP 204: No Content в пустой список 200/JSON - все, что облегчает получение результата в автозаполнении jQueryUI.

Моя первая мысль - передать обратный вызов с двумя аргументами, а именно с объектом запроса и response callback для обработки кода в документации:

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

Объект запроса с единственным свойством, называемым "term", который ссылается на значение, находящееся в настоящее время в текстовом вводе. Например, когда пользователь вводил "новое летнее" в поле города, термин "Автозаполнение" будет равен "новый год".

Обратный вызов ответа, который ожидает, что один аргумент будет содержать данные, предлагаемые пользователю. Эти данные должны быть отфильтрованы на основе предоставленного термина и могут быть в любом из форматов, описанных выше, для простых локальных данных (String-Array или Object-Array с меткой/значением/оба свойства).

Когда обратный вызов ответа не получает никаких данных, он вставляет возвращает специальный однострочный объект-массив, который имеет метку и индикатор, что нет данных (поэтому select/focus распознает это как индикатор, что не данные были возвращены).

Это кажется сложным. Я предпочел бы иметь возможность использовать источник: "http://..." и просто иметь обратный вызов где-то, указывающий, что данные не были возвращены.

Спасибо, что прочитали.

Брайан

EDIT:

Здесь создана функция-оболочка, созданная для решения этой проблемы на основе подтверждения @ThiefMaster, что это правильный способ:

    function autocomplete(input, source_url, on_select, on_focus, default_data) {
        /* Autocompletion for an input field
         * input: the field for autocompleting
         * source_url: the JSON url for getting data
         * on_select: function (event,ui) - when someone selects an element
         * on_focus: function (event, ui) - when someone focuses an element
         * default_data: function () returning default data; alternatively is the
         *               default dataset e.g. {'label':'X','value':'Y'}
         */

        $(input).autocomplete({
            source: function (request, response) {
                $.ajax({
                    url: source_url,
                    dataType: "json",
                    data: request,
                    success: function (data) {
                        if (!data.length) { // expect [] or ""
                            var def_data = typeof(default_data) == 'function' ?
                                default_data() : default_data;
                            response(def_data);
                        } else {
                            response(data);
                        }
                    }
                });
            },
            minLength: 3,
            select: on_select,
            focus: on_focus,
        });
    }
4b9b3361

Ответ 1

Замена функции response объекта автозаполнения может работать, но это обезвреживание. Использование обратного вызова ответа, скорее всего, самый чистый способ достичь того, что вы хотите.

Ответ 3

Легко обращаться с опцией response

$( 'input.Srch' ).autocomplete({
    minLength: 3,
    .......
    response: function(event, ui) {
        if (!ui.content.length) {
                var noResult = { value:"",label:"No results found" };
                ui.content.push(noResult);
        }
    }
});

Вот мой снимок экрана:

введите описание изображения здесь