Подтвердить что ты не робот

Как остановить запрос jQuery ajax, отправленный через $.get?

Я делаю запрос ajax, используя $.get, как только пользователь вводит символ в поле ввода я хочу прервать предыдущие вызовы ajax, а затем сделать новый, есть ли способ?

изменить

решена!

Я только что узнал, что $.get - это сокращенный путь к $.ajax, и, следовательно, он возвращает XHR и поэтому мы можем вызвать прерывание для этой переменной.

4b9b3361

Ответ 1

Вы можете использовать .abort() в XMLHttpRequest, который возвращает $.get.

var req = $.get('ajax/test.html', function(data) {
            $('.result').html(data);
            alert('Load was performed.');
          });

//Abort request
req.abort()

От jQuery.ajax() документация:

Функция $.ajax() возвращает объект XMLHttpRequest, который он создает. Обычно jQuery обрабатывает создание этого объекта внутренне, но настраиваемую функцию для его изготовления можно указать с помощью параметра xhr. Возвращенный объект обычно можно отбросить, но он обеспечивает интерфейс нижнего уровня для наблюдения и обработки запроса. В частности, вызов объекта .abort() объекта останавливает запрос до его завершения.

Подробнее о .abort(): https://developer.mozilla.org/en/XMLHttpRequest#abort

Существует также плагин jQuery AjaxQueue для обработки нескольких запросов Ajax, сделанных параллельно.

Ответ 2

Лучшим способом может быть установка тайм-аута в запросе ajax и перезапись его на каждое нажатие клавиши, поэтому фактический запрос не будет срабатывать, пока пользователь не перестанет печатать на секунду. Таким образом, вы не делаете ненужных запросов и меньше загружаете как сервер, так и клиент.

отредактируйте для большей ясности:

var t = false;    
function makeRequest(){
        t = setTimeout(function(){
          $.get() // make the request
        },1000);
    }

Вызов функции на каждом нажатии клавиши. Если пользователь нажимает другую клавишу в течение 1 секунды, тайм-аут будет перезаписан, и в конце он будет запущен только в том случае, если пользователь не нажимает клавишу в течение 1 секунды.