あなたが何をしようとしているのかがはっきりとはわからないので、次のような解決策を次に示します。
- 変更できるのはjQueryajaxインフラストラクチャのみです。ajaxのすべての呼び出し元を変更することはできないため、呼び出し元のコードを変更せずにajax関数内から何かを実行しようとしています。
- ajax呼び出しが開始されたら、すぐに進行状況を表示しますが、ajaxリクエストの送信を1.5秒間遅らせます。
- ajax呼び出しが完了したら、進行状況を非表示にします。
コードは次のとおりです。
// save old function
$.ajaxOld = $.ajax;
// install our global status hide handler
$.ajaxSetup({
complete: function() {
$('.loader').hide();
}
});
// replace ajax call with our own that adds the delay
$.ajax = function() {
// save state from the original function call for use later
var args = [].slice.call(arguments);
var self = this;
// show progress immediately
$('.loader').show();
// call the original ajax function in 1.5 seconds
setTimeout(function() {
$.ajaxOld.apply(self, args);
}, 1500)
}
警告-これは、への呼び出し$.ajax()
がjqXHRオブジェクトを返すことを期待しておらず、ajaxdeferredsが使用されていない限り機能します。これらを使用する場合は、成功ハンドラーと完了ハンドラーを保留する、より複雑なソリューションをコーディングする必要があります。
編集:これらは、質問が何であったかを理解するための古い試みです:
通知が最小限の時間画面に表示されるようにするには、次のようにします。
beforeSend:function(xhr, settings){
xhr.startTime = new Date().getTime();
$('.loader').show();
complete:function(xhr){
var elapsed = new Date().getTime() - xhr.startTime;
if (elapsed < 3000) {
$('.loader').delay(3000 - elapsed).hide(1);
} else {
$('.loader').hide();
}
これにより、メッセージが画面に表示されていた時間を追跡し、ajax呼び出しがすぐに行われた場合、3秒が経過するまでメッセージの非表示を遅らせます。ajax呼び出しがすぐに行われず、メッセージがすでに十分に長く表示されている場合は、ajax呼び出しが完了するとメッセージが非表示になります。
コンテンツの読み込みを遅らせることで、complete
ハンドラーで結果を処理している場合は、次のように行うことができます。
function finishMyAjax(xhr) {
// load your ajax content
$('.loader').hide();
}
beforeSend:function(xhr, settings){
xhr.startTime = new Date().getTime();
$('.loader').show();
complete:function(xhr){
var elapsed = new Date().getTime() - xhr.startTime;
var self = this;
var args = [].slice.call(arguments);
if (elapsed < 3000) {
setTimeout(function() {
finishMyAjax.apply(self, args);
}, 3000-elapsed);
} else {
finishMyAjax.apply(this, arguments);
}
ajaxの結果をすべて完全なハンドラーで処理していない場合は、結果を処理するためのコードを含めてください。そうすれば、このアイデアに含めることができます。ここでの一般的な考え方は、ajax呼び出しが開始する時間を記録することです。ajax応答が来たときに、それが3秒未満である場合、3秒の残り時間のタイマーを設定し、タイマーコールバックで応答を終了します。3秒以上経過している場合は、先に進んで結果を通常どおり処理します。
これにより、必要以上の時間を使用することはありませんが、常に少なくとも3秒は使用できます。ajax呼び出しの起動を3秒間遅らせることもできますが、ajax呼び出しで結果が得られるまでに6秒かかる場合、プロセス全体で9秒かかりますが、これは希望どおりではありません。私のスキームでは、ajaxの結果に1秒かかる場合、処理を3秒まで遅らせます。ajaxの結果に6秒かかる場合、結果はすぐに処理されます(3秒の遅延はありません)。