変数 ajaxdata は、success 関数内で変更されます。まだ変更されていない場合は、2 秒待ってから変更せずに続行します。
使用例は、jqueryui オートコンプリート フィールドです。オートコンプリート ソースは ajax リクエストですが、ユーザーがすばやく入力し、リストが読み込まれる前にフィールドを終了すると、フィールドは未設定のままになります。オートコンプリートで「変更」イベントを使用して、ユーザーが有効なオプションを選択せずに入力したかどうかを確認しますが、変更イベントが発生したときにソースが読み込まれていない場合、これは機能しません。ソース(変数「ajaxdata」に格納されている)が空の場合、待機する変更関数に遅延を入れたいと思います。
コード:
input.autocomplete({
source: function (request, response){
$.ajax(
{
type: "GET",
url: "/some/url",
dataType: "json",
success: function(data){
response($.map(data,function(item){
return{
label: item.label,
value: item.value
}
}));
ajaxdata = data;
}
}
);
// ajaxopts = ajaxsource(request,response,ajaxurl,xtraqry)
},
change: function(event, ui) {
if (!ui.item) {
// user didn't select an option, but what they typed may still match
var enteredString = $(this).val();
var stringMatch = false;
if (ajaxdata.length==0){
/// THIS IS WHERE I NEED A 2 SECOND DELAY
}
var opts = ajaxdata;
for (var i=0; i < opts.length; i++){
if(opts[i].label.toLowerCase() == enteredString.toLowerCase()){
$(this).val(opts[i].label);// corrects any incorrect case
stringMatch = true;
break;
}
}
}
},
});
編集:
問題についてより具体的に言うと、この遅延は条件付きである必要があります。つまり、データが既にロードされている場合 (静的ソースから、または以前の ajax 呼び出しから来たため)、遅延が発生したくないということです。