Автозаполнение пользовательского интерфейса jQuery: отмена запроса - PullRequest
6 голосов
/ 24 июня 2011

Я использую версию обратного вызова опции source, которая выполняет запрос ajax. Я полагаю, что если пользователь набирает кучу букв в быстрой последовательности до завершения ajax-запроса, мы должны прервать старый и использовать только новый. Я предполагаю, что версия URL для параметра source сделает это автоматически, но, поскольку я использую пользовательский обратный вызов, мне придется делать это вручную.

Итак, вот что у меня есть:

$('#myselector').autocomplete({
    source: function(request, response) {
        var data = {};
        if($(this).data('xhr')) {
            console.log('aborting...');
            $(this).data('xhr').abort();
        }
        // *snip* add some stuff to data
        $(this).data('xhr', $.ajax({
            url: '/ajax/major_city',
            dataType: 'json',
            data: data,
            success: function(data, textStatus, $xhr) {
                response(data);
            },
            complete: function($xhr, textStatus) {
                console.log(textStatus);
                if(textStatus === 'abort') {
                    console.log('aborted!');
                    response([]);
                }
            }
        }));
    },
// ....

Таким образом, всякий раз, когда вызывается обратный вызов «source», он проверяет, существует ли элемент XHR для этого ввода (будет неопределенным в первый раз), и если да, то прерывает его ( side question: how можно проверить, завершен ли запрос? Нет смысла пытаться отменить запросы, которые уже выполнены).

Но В документах написано :

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

Итак, в нижней части моего кода вы увидите, что я (пытаюсь) проверить, был ли запрос отменен, и если да, я возвращаю пустой список. Но это "прервано!" журнал никогда не кажется, называется. Он всегда говорит «успех», даже когда он прерывается. Почему это?


Редактировать: Только что попытался вывести $(this).data('xhr').readyState. Кажется, он никогда не бывает меньше 4, что подсказывает мне, что source не вызывается снова, пока последний запрос не вернет ответ. Что обидно, потому что мы могли бы прервать запросы раньше времени и немного ускорить время отклика ...

Ответы [ 2 ]

4 голосов
/ 18 октября 2012

bdparrish имеет правильную идею

Увеличение времени ожидания плагина перед отправкой запроса:

$( ".selector" ).autocomplete({ delay: 500 }); //default is 300

Таким образом, вы отправите запрос только после того, как подозреваете, что пользователь закончил печатать. Лучше сделать меньше http запросов, чем сделать много и отменить их.

-Lededje

0 голосов
/ 24 июня 2011

Есть ли причина, по которой вы не можете установить временной интервал, в течение которого пользователь будет «казаться», будто он закончил печатать? Параметр 'delay' устанавливает миллисекунды, в течение которых он будет ждать после ввода последней буквы перед поиском.

Кроме того, ответ все равно будет успешным, даже если вы вернете 'abort' с сервера. потому что запрос не выдал ошибку на сервере. вы возвращаете значение 'abort', которое я предполагаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...