なぜIEはこのalert()を表示しないのでしょうか?
-
20-09-2019 - |
質問
次のコードがあります。
// 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
属性は、これらの手順を実行した結果を返す必要があります。
- 状態が UNSENT または OPENED の場合は 0 を返し、これらのステップを終了します。
- エラーフラグが true の場合は 0 を返し、これらのステップを終了します。
- HTTPステータスコードを返します。
私は、あなたが文字列の連結に問題があると思います。ただ、この方法を試してください。
status = pageRequest.status;
status += '';
alert('pageRequest.readyState: ' + pageRequest.readyState \
+ '\npageRequest.status: ' + status);