jQueryのajaxSendとajaxStopを使用して、ajaxリクエストがアクティブなときはいつでもスピナーを表示しました。一部のプラグインがajaxリクエストを中止した場合を除いて、ajaxStopはトリガーされず、ページが更新されるまでトリガーされません。中止されたリクエストはまだjQueryにカウントされているようです。ajaxStopトリガーを作成できますか、それともより良い方法がありますか?
3 に答える
さて、私はとても好きな方法を見つけました。XMLHttpRequest の abort メソッドにパッチを適用して、jQuery の ajax カウンターを減らし、それが最後のリクエストである場合にハンドラーをトリガーするようにします。ブラウザ間でどれだけうまく機能するかはまだわかりません.
var old_abort = XMLHttpRequest.prototype.abort;
XMLHttpRequest.prototype.abort = function(){
jQuery.proxy(old_abort, this)();
if ( jQuery.active-- === 1 )
jQuery.event.trigger( "ajaxStop" );
};
これは、dataType ="json"のjQuery1.4.2でのみ問題になるようです。http://forum.jquery.com/topic/ajaxstart-not-fired-when-jquery-active-changes-from-0-を参照してください。 to-1
jQuery 1.5.1にアップグレードするか、上記のJakeによって投稿されたパッチを適用します。また、私のユースケースで正しく機能する前に、パッチを次のように変更する必要がありました。
f_abort = XMLHttpRequest.prototype.abort;
XMLHttpRequest.prototype.abort = function() {
$.proxy(f_abort, this)();
if ($.active === 1) {
$.event.trigger("ajaxStop");
$.active = 0;
} else if ($.active > 1) {
$.active--;
}
};
代わりに完全なイベントを使用します-それは何があっても実行されます:
complete (ローカル イベント)
このイベントは、リクエストが成功したかどうかに関係なく呼び出されます。同期リクエストであっても、常に完全なコールバックを受け取ります。
$.ajax({
complete: function(){
// hide your spinner
}
});
これが必要かどうかはわかりませんが、ajaxStop イベントをトリガーできます。$(this).trigger('ajaxStop');