Я не знаю, можете ли вы "отменить" завершение, которое уже началось. Но вы можете получить желаемое, прервав часть рендеринга автозаполнения. Это может работать, если автозаполнение состоит из запроса и рендера, а запрос включает сетевую транзакцию.
Если есть запрос и рендер, а запрос - это просто поиск в локально сохраненном списке, то это, вероятно, не сработает, потому что задержка слишком мала.
В этом вопросе SO описывается, как обезопасить патч для renderMenu и renderItem fns в пакете автозаполнения jQuery. Я думаю, что вы можете использовать тот же подход обезьяны-патч.
Вам необходимо указать в качестве источника функцию, а не URL. Этот ТАК вопрос описывает как. Затем, в этой функции, увеличьте переменную count, которая говорит, что "поиск в процессе". Затем выполните поиск, выполнив «ajax get». Также исправьте renderMenu для (a) рендеринга, только если выполняется один поиск, и (b) для уменьшения количества запросов.
Вероятно, это будет выглядеть примерно так:
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()
, когда поступит новый.