1

URL をブロックしているローカル (またはローカル ネットワーク) のファイアウォールが、この URL への Ajax リクエストが ReadyState 4 に到達するのを妨げていることは理解しています。これは正しいですか?

4

1 に答える 1

1

はい、そうなります。たとえば、このコードを見てください。

function readyStateCallback () {
  jsprint(this.readyState);
};

var oReq = new XMLHttpRequest();
oReq.onreadystatechange = readyStateCallback;
oReq.open("get", "http://foobarbaz.nnn", true);
oReq.send();

この fiddleで試すことができます。すべての要求は、準備完了状態 1 および 4 をトリガーしますが、必ずしも準備完了状態 2 または 3 とは限りません。

XMLHttpRequest MDN ドキュメントを参照してください。

0   UNSENT               open() has not been called yet.
1   OPENED               send() has not been called yet.
2   HEADERS_RECEIVED     send() has been called, and headers and status are available.
3   LOADING              Downloading; responseText holds partial data.
4   DONE                 The operation is complete.

要求が失敗したかどうか (ファイアウォールによってブロックされているなど) を判断するには、this.status を確認します。適切なリクエストの場合、これは 200 になります。応答を受け取らなかったリクエストの場合、これは 0 になります。

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

  1. 状態が UNSENT または OPENED の場合は、0 を返し、これらの手順を終了します。
  2. エラー フラグが設定されている場合は、0 を返し、これらの手順を終了します。
  3. HTTP ステータス コードを返します。

ソース: W3 XMLHttpRequest::status

ネットワーク エラーは次のように説明されます。

DNS エラー、TLS ネゴシエーションの失敗、またはその他の種類のネットワーク エラー エラーが発生した場合に onreadystatechange イベントが発生することについても説明します。準備状態は 4 になります。

ファイアウォールは通常、DNS 解決を禁止するか、TLS パケットが正常に送信されないようにします。

于 2013-08-28T15:02:28.487 に答える