jQuery自动完成超时

时间:2012-04-04 10:30:48

标签: javascript jquery-ui jquery jquery-autocomplete

出于某种原因,我在网站上制作的ajax请求中止了一半的时间。当我为ajax请求设置超时时,会解决此问题,如下所示。

$.ajax({
    url: "/question/why_wont_it_work",
    timeout : 1000,
    success: function(){ /*do stuff*/ }
});

可悲的是,超时修复似乎不适用于jquery自动完成。我正在使用它:

$( "#questionTags" ).autocomplete({
    source: "/question/tags",
    timeout: 1000,
    select: function(event, ui) { /*do stuff*/ },
});

我检查了网站上的jQueryUI文档,但也没有看到超时选项。现在这很烦人,因为有一半时间我的请求会中止,我不会得到结果 我想要。有没有解决的办法?

提前致谢。

3 个答案:

答案 0 :(得分:7)

您可以为source参数提供任意函数。因此,您可以手动发出AJAX请求并指定timeout选项:

var xhr = null; /* To prevent multiple calls from happening while one is in progress */
$("#questionTags").autocomplete({
    source: function (request, response) {
        if (!xhr) {
            xhr = $.ajax({
                url: "/question/tags",
                timeout: 20000,
                data: request,
                dataType: "json",
                success: function (data) {
                     xhr = null;
                     response(data);
                },
                error: function () {
                    response([]);
                }
            });
        }
    },
    select: function(event, ui) { /*do stuff*/ },
});

但我在@El Ronnoco,你可能想要认真加快你的要求。 20秒是很长的等待时间。

答案 1 :(得分:4)

如果source是一个字符串,jQuery自动完成会执行下面显示的代码来加载数据,因此它不会设置超时。

您可以使用ajaxSetup这样全局设置超时:

$.ajaxSetup({
    timeout: 20000,
});

但这会影响你所有的ajax请求。


来自jquery.ui.autocomplete.js的代码:: _initSource

self.xhr = $.ajax({
    url: url,
    data: request,
    dataType: "json",
    context: {
        autocompleteRequest: ++requestIndex
    },
    success: function( data, status ) {
        if ( this.autocompleteRequest === requestIndex ) {
            response( data );
        }
    },
    error: function() {
        if ( this.autocompleteRequest === requestIndex ) {
            response( [] );
        }
    }
});

答案 2 :(得分:-1)

$target.autocomplete('/question/why_wont_it_work',{
        delay: 2000
    });