Мне интересно, как можно поймать и добавить пользовательский обработчик, когда пустые результаты возвращаются с сервера при использовании 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,
});
}