2017-03-06 10 views
0

AJAX呼び出しのためのjQueryデフォルトのHTTPエラーハンドラを実装しようとしています。次のように私は、一般的なアプリケーションエラーのデフォルトエラーハンドラを実装しました:特定のステータスコードに対してjQueryのデフォルトajaxErrorをオーバーライドします。

$(document).ajaxError(function(event, jqXHR, settings, thrownError) { 
    switch (jqXHR.status) { 
     case 403: 
      console.log('Forbidden, go away!'); 
      break; 
     case 404: 
      console.log('Resource not found :O'); 
      break; 
     case 422: 
      console.log('Unprocessable entity.'); 
      break; 
     case 500: 
      console.log('Someone have to pay for this!'); 
      break; 
     default: 
      console.log('Anyone knows what is going on here?'); 
    } 
}); 

今私が達成したいものを、単一のAJAX呼び出し内の特定のステータスコードをオーバーライドすることです。上記のように、私が実装している場合、私は唯一のThe requested unicorn is actually missingメッセージを取得しようとしている一方で例

$.ajax({ 
    ... 
    error: function(jqXHR, textStatus, errorThrown) { 
     if(jqXHR.status === 404){ 
      console.log('The requested unicorn is actually missing'); 
     } 
    } 
}) 

のためのように、両方のメッセージは

>The requested unicorn is actually missing 
>Resource not found :O 

を表示します。

単一のAJAX呼び出し設定でglobal: falseフラグを設定することは、そのAJAX呼び出し内のすべてのグローバルAJAX関数を無視することを意味し、残念ながらそれは私のアプリケーションにとって実行可能な解決策ではありません。

ありがとう!

+0

https://jsfiddle.net/07wzfyyL/グローバルオプションは、チェックを働いている必要がありますすることができますこのフィドルから – Rex

+0

jQuery docs: 'global:このリクエストに対してグローバルAjaxイベントハンドラをトリガするかどうか。デフォルトはtrueです。 ajaxStartまたはajaxStopのようなグローバルハンドラがトリガされないようにするには、falseに設定します。これは、さまざまなAjaxイベントを制御するために使用できます。この振る舞いは、どんな場合でもグローバルハンドラの実行を防ぎます!ここで必要なのは、単一のajax呼び出しで処理された場合は特定のステータスコードのみをオーバーライドし、HTTPコードがアプリケーションを通じて処理されない場合にのみデフォルトのハンドラを実行することです。 – Desh901

答えて

1

エラーが処理されている場合は、次の

$.ajax({ 
    handleErrors: [404], 
    ... 
    error: function(jqXHR, textStatus, errorThrown) { 
     if(jqXHR.status === 404){ 
      console.log('The requested unicorn is actually missing'); 
     } 
    } 
}); 

は、あなたのグローバルハンドラのチェックに

$(document).ajaxError(function(event, jqXHR, settings, thrownError) { 
    if (settings.handleErrors && settings.handleErrors.indexOf(jqXHR.status) !== -1) { 
     return; 
    } 
    switch (jqXHR.status) { 
     case 403: 
      console.log('Forbidden, go away!'); 
      break; 
     case 404: 
      console.log('Resource not found :O'); 
      break; 
     case 422: 
      console.log('Unprocessable entity.'); 
      break; 
     case 500: 
      console.log('Someone have to pay for this!'); 
      break; 
     default: 
      console.log('Anyone knows what is going on here?'); 
    } 
}); 
+0

ありがとう!!あなたのソリューションは実際には本当にうまく動作します!私はjQueryドキュメントの 'handleErrors'に気付かなかった。素晴らしい答え! – Desh901

+1

'handleErrors'はカスタムプロパティですので、名前を自由に設定できます。 –

+0

これは、ajax設定が '$ .extend'で拡張されているからです – Desh901

関連する問題