Ajaxクエリの投稿エラーをキャッチするにはどうすればよいですか?


209

エラーをキャッチし、Ajaxリクエストが失敗した場合に適切なメッセージを表示したいと思います。

私のコードは次のようですが、失敗したAjaxリクエストをキャッチすることができませんでした。

function getAjaxData(id)
{
     $.post("status.ajax.php", {deviceId : id}, function(data){

        var tab1;

        if (data.length>0) {
            tab1 = data;
        }
        else {
            tab1 = "Error in Ajax";
        }

        return tab1;
    });
}

私は、Ajaxリクエストが失敗したときに「Ajaxのエラー」が実行されることはないことを知りました。

Ajaxエラーを処理し、失敗した場合に適切なメッセージを表示するにはどうすればよいですか?

回答:


304

jQuery 1.5以降では、遅延オブジェクトメカニズムを使用できます。

$.post('some.php', {name: 'John'})
    .done(function(msg){  })
    .fail(function(xhr, status, error) {
        // error handling
    });

別の方法は使用してい.ajaxます:

$.ajax({
  type: "POST",
  url: "some.php",
  data: "name=John&location=Boston",
  success: function(msg){
        alert( "Data Saved: " + msg );
  },
  error: function(XMLHttpRequest, textStatus, errorThrown) {
     alert("some error");
  }
});

14
@Yuck $ .postは、遅延オブジェクトを使用してエラーコールバックを受け入れることができます。例として、以下の私の答えを見てください。
Michael Venable 2012

2
また、私$.ajaxが読みやすくする方法は、ハッシュを使用することdataです。例:{ name : 'John', location: 'Boston' }
briangonzalez 2013年

3
上記の成功とエラーのコールバックは、jQuery 1.8 api.jquery.com/jQuery.post
Baldy

@MichaelVeneble私はあなたが使うことができると思います$.post().error()
clintgh 14

288

jQuery 1.5はこれをうまく処理する遅延オブジェクトを追加しました。呼び出して$.post、必要なハンドラーを呼び出し後に添付するだけです。遅延オブジェクトを使用すると、複数の成功ハンドラとエラーハンドラをアタッチすることもできます。

例:

$.post('status.ajax.php', {deviceId: id})
    .done( function(msg) { ... } )
    .fail( function(xhr, textStatus, errorThrown) {
        alert(xhr.responseText);
    });

jQuery 1.8より前は、関数doneが呼び出されsuccess、とfail呼ばれていましたerror


3
+1とてもいいですが、それでも構文に夢中ではありません。うまくいけば、それは将来のリリースで統合されるでしょう。
Yuck

25
これは受け入れられる答えになるはずです。現在受け入れられている答えは「別の方法を使用する」です。この答えは、「メソッドを機能させる方法です」です。SOでは通常、後者が優先されます。実際、これは$ .postのドキュメントに含まれているはずです!!!
Mark E. Haase

2
api.jquery.com/deferred.failapi.jquery.com/deferred.doneドキュメンテーションのための
Deleplace

ちなみにresponseJSONajaxタイプの場合にもとても重宝なプロパティもありますjson
ivkremer 2015

91
$.ajax({
  type: 'POST',
  url: 'status.ajax.php',
  data: {
     deviceId: id
  },
  success: function(data){
     // your code from above
  },
  error: function(xhr, textStatus, error){
      console.log(xhr.statusText);
      console.log(textStatus);
      console.log(error);
  }
});


13

簡単な方法はajaxErrorを実装することです

Ajaxリクエストがエラーで完了するたびに、jQueryはajaxErrorイベントをトリガーします。.ajaxError()メソッドで登録されたすべてのハンドラーがこの時点で実行されます。

例えば:

$('.log').ajaxError(function() {
  $(this).text('Triggered ajaxError handler.');
});

ajaxErrorのドキュメントを読むことをお勧めします。上記で示した単純なユースケースよりも多くのことを行います-主にそのコールバックはいくつかのパラメーターを受け入れます:

$('.log').ajaxError(function(e, xhr, settings, exception) {
  if (settings.url == 'ajax/missing.html') {
    $(this).text('Triggered ajaxError handler.');
  }
});

1
+
1-

jQuery 1.8以降、.ajaxError()メソッドはドキュメントにのみ添付する必要があることに注意してください。
ナンキ

0

responseTextをログに記録する必要があります。

$.ajax({
    type: 'POST',
    url: 'status.ajax.php',
    data: {
    deviceId: id
  }
})
.done(
 function (data) {
  //your code
 }
)
.fail(function (data) {
      console.log( "Ajax failed: " + data['responseText'] );
})

0

あなたは.onerrorハンドラーをajaxオブジェクトにアタッチします、なぜバニラがクロスプラットフォームで動作するときに人々が応答のためにJQueryを投稿することを主張するのですか...

クイックの例:

ajax = new XMLHttpRequest();
ajax.open( "POST", "/url/to/handler.php", true );
ajax.onerror = function(){
    alert("Oops! Something went wrong...");
}
ajax.send(someWebFormToken );
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.