54

XMLHttpRequestのハンドラーを理解するのに少し問題があります。仕様では、onerrorハンドラーについて次のように述べています。

error [ディスパッチ...]リクエストが失敗したとき。

load [ディスパッチ...]リクエストが正常に完了したとき。

問題は、「リクエストが失敗した」とはどういう意味かということです。それは可能性があります

  • リクエストをまったく発行できなかった(接続が拒否されたなどのエラーなど)、または
  • 上記に加えて、サーバーがエラーコード(例:404)を返しました

また、それが同時に発砲することを意味onerrorし、決して発砲してはならないかどうかを知りたいです。onload

この参照は、コードおよびに応じonerrorてハンドラーを実行する必要があることを示しています。これは、それらが相互に排他的ではないことを示していますが、これは信頼できる情報ではないと思います。statusonloadreadyState

onload最新のOperaスナップショットを使用しているので、404ステータスコードでも起動されることがわかりました。テストは確かに間違いないことは知っていますstatusが、それが仕様ごとにやらなければならないことなのか、それともOperaのバグの回避策なのかを知りたいのです。

4

2 に答える 2

80

コメントで述べたように、ネットワークレベルonerrorで障害が発生したときに発生します。エラーがアプリケーションレベルでのみ存在する場合、たとえばHTTPエラーコードが送信された場合でも、発生します。返されたステータスコードをハンドラーで明示的にテストする必要があります。onloadonreadystatechange

拒否されたクロスドメインリクエストもonerrorハンドラーを起動することに注意してください。

于 2012-05-14T13:41:11.930 に答える
3

apsillersの回答に加えて、XMLHttpRequestはバックグラウンドでリダイレクトを自動的に処理するため、イベントでこの応答コードを確認する必要はありませんonload(このイベントは、最後の呼び出しで1回だけ呼び出されます)。また、POSTメソッドを使用してペイロードデータを送信し、リクエストがリダイレクトされる場合、XMLHttpRequestはメソッドをからPOSTに変更し、GETセキュリティ上の理由からペイロードデータを破棄することにも注意してください。イベントは引き続き呼び出されますが、onloadリクエストを手動で新しい宛先に再送信する必要があります。

于 2016-08-14T07:55:23.860 に答える