2

私は次のコードを持っています:

// 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)

4

3 に答える 3

1

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

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はInternetExplorerで呼び出され、readyState1(OPENED)です。この状態では、リクエストは送信されていますが、レスポンスはまだ受信されていません。ステータスを読み取るHTTP応答がないためstatus、このプロパティを呼び出すとエラーが発生します。readyState

この動作は、 W3CXMLHttpRequest仕様の古いバージョンと互換性があります。

属性が使用できない場合はstatus、例外を発生させる必要があります。readyState が3(受信中)または4(ロード済み)のときに使用可能である必要があります。使用可能な場合は、HTTPステータスコードを表す必要があります(通常、接続を成功させるには200)。

検索の例外

INVALID_STATE_ERRreadyStateに不適切な値があるときにこの属性にアクセスすると、DOMExceptionが発生する必要があります。

ただし、仕様の新しいバージョンstatusでは、常に値を返す必要があると記載されています。

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

  1. 状態がUNSENTまたはOPENEDの場合は、0を返し、これらのステップを終了します。
  2. エラーフラグがtrueの場合は、0を返し、これらの手順を終了します。
  3. HTTPステータスコードを返します。
于 2010-03-15T23:24:41.680 に答える
1

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

于 2010-03-15T23:18:16.817 に答える
0

PageRequest.status(整数)を評価するときに、文字列の連結に問題があると思います。これを試してみてください:

status = pageRequest.status;
status += '';
alert('pageRequest.readyState: ' + pageRequest.readyState \
+ '\npageRequest.status: ' + status);
于 2010-03-15T23:24:59.840 に答える