質問

次のコードがあります。

// setup the AJAX request
var pageRequest = false;
if(window.XMLHttpRequest)     pageRequest = new XMLHttpRequest();
else if(window.ActiveXObject) pageRequest = new ActiveXObject("Microsoft.XMLHTTP");

// callback
pageRequest.onreadystatechange = function() {

    alert('pageRequest.readyState: ' + pageRequest.readyState
        + '\npageRequest.status: ' + pageRequest.status);
}

pageRequest.open('POST','ajax.php',true);

// q_str contains something like 'data=value...'

pageRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
pageRequest.setRequestHeader("Content-length", q_str.length);
pageRequest.setRequestHeader("Connection", "close");

pageRequest.send(q_str);

これはChromeで正常に機能しますが、IEはそれを窒息させ、「不特定のエラー」を吐き出します。そして、それはalert()のラインを指します。なぜアラートが表示されないのでしょうか?

編集:さて、エラー ダイアログを閉じると、予想どおり 3 つのアラートが表示されます。

編集:今は本当に奇妙になってきています。私が変わったら

alert('pageRequest.readyState: ' + pageRequest.readyState
        + '\npageRequest.status: ' + pageRequest.status);

alert('pageRequest.readyState: ' + pageRequest.readyState);

その後、それは機能し、5つのアラートが表示されます。(1,1,2,3,4)

役に立ちましたか?

解決

ステータスは、メソッドが呼び出された最初の 2 回の HTTP 応答であり、readyState として 1 と 1 が返されます。ReadyState 1 の意味 「オブジェクトは作成されましたが、send メソッドが呼び出されていません。」. 。この時点では、サーバーはリクエストを受信して​​いないため、サーバーからステータス応答はありません。そのため、アラートでステータスを使用するとエラーが発生します。

他のヒント

Chrome 4 でもエラーが発生します (INVALID_STATE_ERR:DOM 例外 11)。Chrome Javascript コンソールを開くと、エラーが表示されます。

Firefox 3.6 でもエラーが発生しますが、エラーは黙って破棄されるようです (エラー コンソールには表示されません)。関数をラップすると、 try..catch ブロックすると、エラー メッセージが表示されます (コンポーネントが失敗コードを返しました:0x80040111 (NS_ERROR_NOT_AVAILABLE)):

pageRequest.onreadystatechange = function() {
  try {
    alert('pageRequest.readyState: ' + pageRequest.readyState
          + '\npageRequest.status: ' + pageRequest.status);
  }
  catch (e) { 
    alert(e); 
  }
}

最初の2回は onreadystatechange Internet Explorer で呼び出されます。 readyState は 1 (オープン) です。この状態では、リクエストは送信されていますが、応答はまだ受信されていません。を呼び出すとエラーが発生します status この中の財産 readyState ステータスを読み取るための HTTP 応答がないためです。

この動作は、古いバージョンの W3C XMLHttpRequest仕様, 、 どの状態:

もし status 属性は利用できません。例外を提起する必要があります。いつでも利用可能でなければなりません readyState は 3 (受信中) または 4 (ロード済み) です。利用可能な場合は、HTTPステータスコード(通常、接続が成功するために200)を表す必要があります。

取得時の例外

DOM例外 INVALID_STATE_ERR ReadyStateの不適切な値がある場合、この属性にアクセスされる場合は、掲載する必要があります。

新しいバージョン ただし、仕様には次のように記載されています status 常に値を返さなければなりません:

status 属性は、これらの手順を実行した結果を返す必要があります。

  1. 状態が UNSENT または OPENED の場合は 0 を返し、これらのステップを終了します。
  2. エラーフラグが true の場合は 0 を返し、これらのステップを終了します。
  3. HTTPステータスコードを返します。
(整数)PageRequest.statusを評価するときに

私は、あなたが文字列の連結に問題があると思います。ただ、この方法を試してください。

status = pageRequest.status;
status += '';
alert('pageRequest.readyState: ' + pageRequest.readyState \
+ '\npageRequest.status: ' + status);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top