Я имею, создают livesearch с jQuery.ajax () метод. На каждый keyup события это получает новые данные результата из сервера.
Проблема, когда я ввожу очень быстро, например, "foobar" и ПОЛУЧИТЬ запрос "fooba" требуют большего количества времени, чем запрос "foobar", результаты "fooba" показывают.
Для обработки это с параметром тайм-аута невозможно, я думаю.
У кого-либо есть идея, как решить это?
Вы можете сохранить и .abort ()
последний запрос при запуске нового, например:
var curSearch;
$("#myInput").keyup(function() {
if(curSearch) curSearch.abort(); //cancel previous search
curSearch = $.ajax({ ...ajax options... }); //start a new one, save a reference
});
Метод $. Ajax ()
возвращает XmlHttpRequest , так что просто держитесь за него, и когда вы начнете следующий поиск, прервите предыдущий.
Присвойте уникальный, возрастающий ID каждому запросу, и показывайте их только в возрастающем порядке. Что-то вроде этого:
var counter = 0, lastCounter = 0;
function doAjax() {
++counter;
jQuery.ajax(url, function (result) {
if (counter < lastCounter)
return;
lastCounter = counter;
processResult(result);
});
}
Кажется, что отправка ajax-запроса на каждое событие KeyUp требует большого количества трафика. Вам следует подождать, пока пользователь перестанет набирать текст - предполагается, что он закончил, по крайней мере, в течение нескольких 100 миллисекунд.
Я бы сделал так:
var ajaxTimeout;
function doAjax() {
//Your actual ajax request code
}
function keyUpHandler() {
if (ajaxTimeout !== undefined)
clearTimeout(ajaxTimeout);
ajaxTimeout = setTimeout(doAjax, 200);
}
Возможно, вам придется поиграть с фактическим временем ожидания, но этот способ работает очень хорошо и не требует других плагинов.
Редактировать: Если вам нужно передавать параметры, создайте встроенную функцию (закрытие).
...
var fun = function() { doAjax(params...) };
ajaxTimeout = setTimeout(fun, 200);
Вам понадобится какая-то очередь ajax, например:
http://plugins.jquery.com/project/ajaxqueue
или http://www.protofunc.com/scripts/jquery/ajaxManager/
EDIT:Другой вариант, изучите код плагина Autocomplete и эмулируйте его. (есть несколько Autocomplete, а также тот, что в jquery UI) ИЛИ просто внедрите Autocomplete, если это отвечает вашим потребностям
Вы должны начинать поиск только тогда, когда пользователь ничего не набирает некоторое время (500 мс или около того). Это предотвратит возникшую у вас проблему.
Отличный плагин jQuery, который именно это делает, - delayedObserver :
Сделать так, чтобы каждый отменял последний. Это может быть слишком большая отмена, но при медленном вводе она сработает.