4

何らかの理由で、私が取り組んでいるWebサイトでの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*/ },
});

WebサイトでjQueryUIのドキュメントを確認しましたが、タイムアウトオプションも表示されませんでした。半分の時間でリクエストが中止され、希望する結果が得られないため、これはかなり厄介です。これを回避する方法はありますか?

前もって感謝します。

4

3 に答える 3

8

パラメータに任意の関数を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 秒は長い待ち時間です。

于 2012-04-04T11:01:33.193 に答える
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( [] );
        }
    }
});
于 2012-04-04T10:49:30.473 に答える
0
$target.autocomplete('/question/why_wont_it_work',{
        delay: 2000
    });
于 2015-04-13T10:04:37.697 に答える