3

jQueryのajaxSendとajaxStopを使用して、ajaxリクエストがアクティブなときはいつでもスピナーを表示しました。一部のプラグインがajaxリクエストを中止した場合を除いて、ajaxStopはトリガーされず、ページが更新されるまでトリガーされません。中止されたリクエストはまだjQueryにカウントされているようです。ajaxStopトリガーを作成できますか、それともより良い方法がありますか?

4

3 に答える 3

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" );
};
于 2010-06-29T03:56:48.683 に答える
2

これは、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--;
  }
};
于 2011-03-19T15:38:26.450 に答える
1

代わりに完全なイベントを使用します-それは何があっても実行されます:

complete (ローカル イベント)
このイベントは、リクエストが成功したかどうかに関係なく呼び出されます。同期リクエストであっても、常に完全なコールバックを受け取ります。

$.ajax({
   complete: function(){
     // hide your spinner
   }
 });

これが必要かどうかはわかりませんが、ajaxStop イベントをトリガーできます。$(this).trigger('ajaxStop');

于 2010-06-28T04:47:37.240 に答える