jQuery.ajax (): отбросьте медленные запросы

Я имею, создают livesearch с jQuery.ajax () метод. На каждый keyup события это получает новые данные результата из сервера.

Проблема, когда я ввожу очень быстро, например, "foobar" и ПОЛУЧИТЬ запрос "fooba" требуют большего количества времени, чем запрос "foobar", результаты "fooba" показывают.

Для обработки это с параметром тайм-аута невозможно, я думаю.

У кого-либо есть идея, как решить это?

5
задан Thomas 15 June 2010 в 17:53
поделиться

6 ответов

Вы можете сохранить и .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 , так что просто держитесь за него, и когда вы начнете следующий поиск, прервите предыдущий.

7
ответ дан 14 December 2019 в 04:30
поделиться

Присвойте уникальный, возрастающий ID каждому запросу, и показывайте их только в возрастающем порядке. Что-то вроде этого:

var counter = 0, lastCounter = 0;
function doAjax() {
  ++counter;
  jQuery.ajax(url, function (result) {
    if (counter < lastCounter)
      return;
    lastCounter = counter;
    processResult(result);
  });
}
1
ответ дан 14 December 2019 в 04:30
поделиться

Кажется, что отправка 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);
0
ответ дан 14 December 2019 в 04:30
поделиться

Вам понадобится какая-то очередь ajax, например:

http://plugins.jquery.com/project/ajaxqueue

или http://www.protofunc.com/scripts/jquery/ajaxManager/

EDIT:Другой вариант, изучите код плагина Autocomplete и эмулируйте его. (есть несколько Autocomplete, а также тот, что в jquery UI) ИЛИ просто внедрите Autocomplete, если это отвечает вашим потребностям

0
ответ дан 14 December 2019 в 04:30
поделиться

Вы должны начинать поиск только тогда, когда пользователь ничего не набирает некоторое время (500 мс или около того). Это предотвратит возникшую у вас проблему.

Отличный плагин jQuery, который именно это делает, - delayedObserver :

http://code.google.com/p/jquery-utils/wiki/DelayedObserver

0
ответ дан 14 December 2019 в 04:30
поделиться

Сделать так, чтобы каждый отменял последний. Это может быть слишком большая отмена, но при медленном вводе она сработает.

0
ответ дан 14 December 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: