5

簡単な質問があります (しかし、答えは簡単ではないようです)。

コードに同期 AJAX 呼び出しがあり、この同期呼び出しの前に関数を呼び出したいと考えています。

呼び出したい関数は単純です

$.blockUI();

jQuery BlockUI プラグインから。

$.ajax 呼び出しの前にその行を配置しようとしましたが、blockUI は同期呼び出しの後に呼び出されるようです。

次に、上記と同じ問題である $.ajax の beforeSend オプションを使用しようとしました。

あなたがもたらすことができる答えを事前に感謝します(私の場合は不可能な非同期呼び出しを使用することを除いて...)

コードはこちらから入手できます: http://jsfiddle.net/vWsus/2/

4

4 に答える 4

4

同期呼び出しは良くありません。ブラウザーがロックされ、呼び出しが返されない場合、ユーザー エクスペリエンスは良くありません。あなたが抱えている問題は、同期呼び出しがブラウザーをロックしているため、DOM が再描画する時間がないことです。DOM が更新されるまでの時間を与える必要があるため、Ajax 呼び出しを行う前にタイムアウトを設定します。

$.blockUI({ message: '<p>foo</p>' });
window.setTimeout( ajxCallFnc, 100);
于 2012-07-24T14:46:11.363 に答える
1

あなたの場合、同期呼び出しの後に blockUI が呼び出されるのではなく、同期要求が表示のリフローを防止するだけです (通常、実際の DOM 操作よりも「後で」発生します)。そして、あなたが言ったように、 beforeSend コールバック内からではなく、ajax への呼び出しの前に blockUI を試して呼び出した場合、ほとんど同じ結果になります。

この動作を防ぐためにjQueryでできることは何もありません。これはjQueryのバグではないためです(ブラウザ自体でもありません。同期xhrリクエストはとにかくブラウザをフリーズするはずであり、ブラウザが続行する必要があるとは何も言っていません)その場合はリフローで)。

私が推奨できるのは、決して同期リクエストを使用しないことだけです。非同期のものは簡単に扱えます。

XMLHttpRequest を非同期的に使用する必要がある理由をご覧ください。

于 2012-07-24T14:54:27.210 に答える
0

$.blockUI には onBlock 関数があります。次のようなことを試してください:

$.blockUI({ 
    message: '<img id="processing" src="images/loading.gif" />', 
    onBlock: function() {
        // make your sync call here
        $.ajax({
            type: 'POST',
            cache: false,
            async: false,               
            url: blahblah,
            dataType: 'json'                
        }).done(function(data){
            //process response

        });
    }
}); 
于 2014-02-24T20:58:27.143 に答える
0
this.notifyFixed=function(type,msg,callback){
        this.showNotification(type, msg);
            window.setTimeout(function(){
                if(typeof callback ==="function"){
                    callback();
                }
            },100);
    };

ajax呼び出しを行う前に実行したいnotifyFixed関数があり、同じ問題が発生していたので、タイムアウトとepascarelloに似たコールバック関数を追加しました。

うまくいけば、同様のソリューションが他の人を助けることができます

于 2014-08-12T18:20:37.320 に答える