библиотека jQuery автозаполнения пользовательского интерфейса, отменить последний запрос, при вводе
Я использую автозаполнение jQuery UI для поиска города на моем сайте. Он начинает поиск после того, как пользователь ввел 3 символа.
Мне интересно, как изменить этот скрипт, чтобы прервать последний запрос, если пользователь продолжает печатать.function enableCitiesAutocomplete() {
var url = LIST.urls.api_cities_search;
$('#txt_search_city').autocomplete({
source: url,
minLength: 3,
select: function( event, ui ) {
$(this).val( ui.item.value );
$( "#id_city" ).val( ui.item.id );
$(this).closest('form').submit();
}
});
}
1 ответ:
Я не знаю, можете ли вы" прервать " завершение, которое уже началось. Но вы можете получить то, что хотите, прервав рендеринг части автозаполнения. Это может сработать, если автозаполнение состоит из запроса и визуализации, а запрос включает в себя сетевую транзакцию.
Если есть запрос и рендеринг, а запрос-это просто поиск по локально сохраненному списку, то это, вероятно, не сработает, потому что задержка слишком мала.Это так Вопрос описывает как обезьяна-патч renderMenu и renderItem fns в пакете автозаполнения jQuery. Я думаю, что вы можете использовать тот же подход обезьяны-патча.
Вам нужно указать в качестве источника функцию,а не URL-адрес. Этот так называемый вопрос описывает, как. Затем в этой функции увеличьте переменную count, которая говорит: "поиск находится в процессе". Затем выполните поиск, выполнив команду "ajax get". Также исправьте renderMenu на (а) только для рендеринга, если выполняется один поиск, и (Б) декремент счет поисков.
Это, вероятно, будет выглядеть примерно так:
var queriesInProcess = 0; var ac = $('#txt_search_city').autocomplete({ minLength: 3, select : .... , // The source option can be a function that performs the search, // and calls a response function with the matched entries. source: function(req, responseFn) { var url = baseUrl + req.term; queriesInProcess++; $.ajax({ url: url, //data: data, success: function(json,xhr) { queriesInProcess--; var a = ....retrieve from the json .... responseFn( a ); }, errpr : function () { queriesInProcess--; }, dataType: 'json' }); } }); ac.data( "autocomplete" )._renderMenu = function( ul, items ) { if (queriesInProcess > 0) return; var self = this; $.each( items, function( index, item ) { self._renderItem( ul, item ); }); };
Если вы хотите получить более сложный, вы также можете попробовать прервать ожидающий запрос ajax. Это должно было бы произойти в исходной функции; вам нужно было бы кэшировать / прятать XHR, возвращенный из вызова
$.ajax()
, и вызыватьabort()
, когда приходит новый.