26

このような質問から分岐して、jQuery の $.ajax() メソッドをラップして、1 つの場所でエラー処理を提供できるようにしようとしています。これは、アプリケーションのすべてのリモート呼び出しで自動的に使用されます。

簡単なアプローチは、$.get() と $.post() が $.ajax() にファサードを実装する方法と同様に、単純に新しい名前を作成することです。ただし、$.ajax() という名前を再利用して、標準の jQuery 構文を使用して残りのコードを保持し、独自のエラー処理を追加したという事実を隠蔽できるようにしたいと考えています。これは実用的かつ/または達成するのに適していますか、それとも恐ろしいアイデアですか?

編集: これまでの応答は、.ajaxError() が進むべき道であることを示しています。これで 400 および 500 レベルのエラーがキャッチされることはわかっていますが、302 リダイレクトもキャッチする方法 (このイベント ハンドラーなどを使用) はありますか? ログインページにリダイレクトする応答を処理しようとしていますが、XHR 要求の場合はそのリダイレクトを傍受し、ユーザーが自動的に転送するのではなくアクションをキャンセルできるようにしたいと考えています。

4

4 に答える 4

34

をご覧になることをお勧めします$.ajaxError

$(document).ajaxError(function myErrorHandler(event, xhr, ajaxOptions, thrownError) {
  alert("There was an ajax error!");
});

jQuery には、グローバル ハンドラをアタッチするための方法が他にもたくさんあります

編集に答えるには、成功した ajax リクエストを$.ajaxSuccessでキャッチし、すべて (成功および失敗) を でキャッチできます$.ajaxCompletexhr次のように、パラメーターから応答コードを取得できます。

$(document).ajaxComplete(function myErrorHandler(event, xhr, ajaxOptions, thrownError) {
  alert("Ajax request completed with response code " + xhr.status);
});
于 2010-12-03T02:31:26.200 に答える
1

.ajaxError()実際、jQuery はこの目的のためだけにフックを提供します。$ajaxError()ページからの ajax リクエストがエラーで完了すると、バインドしたすべてのハンドラーが呼び出されます。セレクターを指定すると、ハンドラーthis内で参照できます。.ajaxError()

これを使用してページ上のすべての ajax リクエスト エラーを処理し、thisを指すために使用するにdocumentは、次のようにします。

$(document).ajaxError(function(event, request, settings){
   alert("Error requesting page: " + settings.url);
});
于 2010-12-03T02:32:55.300 に答える
0

それは悪い考えだと思います。ラッピングは問題ないと思いますが、再定義$.ajaxについて話しているのです。これを理解していない人は、予想外の結果を得るでしょう。

他の人が述べたように、ハンドラーをにバインドすること$.ajaxErrorが道です。

于 2010-12-03T02:37:32.013 に答える