多个自动完成调用 - jQuery

时间:2012-04-04 19:31:25

标签: jquery jquery-ui jquery-ui-autocomplete

我正在查看jQuery UI自动完成文档,并查看他们使用缓存进行回调的示例:

$(function() {
    var cache = {}, lastXhr;

    $('#Field').autocomplete({
        minLength: 2,
        delay: 600,
        source: function(request, response) {
            var term = request.term;

            if( term in cache ) {
                response(cache[term]);
                return;
            }

            lastXhr = $.post('LoadData', function(data, status, xhr) {
                cache[term] = data;

                if(xhr === lastXhr) {
                    response(data);
                }
            });
        }
    });
});

代码连接一个字段以使用自动完成并存储已经被命中的查询缓存。使用以下行,因此如果一个查询花费的时间长于另一个查询,则不会替换自动完成值:

if(xhr === lastXhr) {
    response(data);
}

如果我开始键入几个字母然后进入服务器查询数据,那么我暂停并再次开始输入,它将触发另一次访问服务器。 如果第一个查询在第二个查询结束后完成,则加载图标永远不会消失。我认为这是因为它永远不会调用response()回调。有没有办法可以在第二次请求后取消第一个请求?

3 个答案:

答案 0 :(得分:2)

您可以在发帖前添加lastXhr.abort()吗?这会在每次开始新请求时取消先前的请求。

$(function() {
    var cache = {}, lastXhr;

    $('#Field').autocomplete({
        minLength: 2,
        delay: 600,
        source: function(request, response) {
            var term = request.term;

            if( term in cache ) {
                response(cache[term]);
                return;
            }

            // Abort previous access if one is defined
            if (typeof lastXhr !== 'undefined' && lastXhr.hasOwnProperty("abort")) {
                lastXhr.abort();
            }

            lastXhr = $.post('LoadData', function(data, status, xhr) {
                cache[term] = data;

                if(xhr === lastXhr) {
                    response(data);
                    // Set to undefined, we are done:
                    // helps when deciding to abort
                    lastXhr = undefined;
                }
            });
        }
    });
});

答案 1 :(得分:1)

将最终结果与请求一起缓存。然后,您可以确保每次都调用响应回调,而lastData将确保使用正确的数据,无论查询是否不同步。

如:

$(function() {
    var cache = {}, lastXhr,lastData;

    $('#Field').autocomplete({
        minLength: 2,
        delay: 600,
        source: function(request, response) {
            var term = request.term;

            if( term in cache ) {
                response(cache[term]);
                return;
            }

            lastXhr = $.post('LoadData', function(data, status, xhr) {
                cache[term] = data;

                if(xhr === lastXhr) {
                    response(data);
                    // Store the latest data
                    lastData = data;

                }
                else
                {
                    // Queries have come back out of sync - this isn't the last one
                    // but we need to call response to stop the spinner
                    response(lastData);
                }
            });
        }
    });
 });

答案 2 :(得分:0)

我只会做:

if(xhr === lastXhr) {
    response(data);
} else {
    return false;
}