JQuery 1.8では、async:false
in jQuery.ajax() isdeprecated。
しかし、進行中のAJAX通信がバックグラウンドで行われているときに、 "ローディング画面"でいくつのWebページを見たことがありますか?私はおそらく何千ものそれらを見ました。
私の場合は、言語ファイルをロードする必要があるモバイルアプリを書いているということです。そして、最初に言語ファイルをロードし、言語ファイルからボタンおよびその他のGUI要素のテキストを取得します。
これは私にとって本当に悪いことです。言語ファイルがない場合、GUIが表示されないためです。それでは、どうすれば解決できますか?すべてのコードをsuccess
コールバックに入れますか?それは私には良いコーディングの練習のように思えません。別の方法で解決できますか?
解決策は、ユーザーがインターフェイスと対話できないようにオーバーレイを手動で追加し、AJAXクエリが完了したら削除します。
$(function() {
show_overlay();
$.ajax({
// Query to server
}).done(function() {
// Verify good data
// Do stuff
remove_overlay();
});
});
多くこれらの1000のページのうち、AJAX呼び出しを待っている間、実際にUIをブロックしません。代わりに、おそらく待機でUIを覆い隠します。呼び出し時に画面を表示してから、応答ハンドラーでそれを削除します。
UIを隠す方法はたくさんあります(モーダルに設定され、エスケープボタンや閉じるボタンのないjQuery UIダイアログを使用することもできます)。その決定はあなたに任せます。ただし、コードのレイアウトは次のようになります。
var someFunction = function () {
// any pre-conditions to the logic
// obscure the UI here
$.ajax({
url: 'ajax/test.html',
success: function(data) {
// handle the response
// show the UI again
},
error: function(data) {
// handle the response
// show the UI again
}
});
}
イベントの順序を達成する方法は複数あると確信していますが、それが一般的な考え方です。 UIのブロックは決して意図されたものではなく、jQueryがincludeすることよりもremoveすることよりもさらに難しい決定だったと思います。非同期であることを意図しています。
このファイルを取得するためになぜajaxを使用するのですか? script
タグを使用して含めるだけです。
いずれにせよ、すべてのコードをonSuccessに置くのではなく、代わりにそこからコードを実行する単一の関数を呼び出します。