11

ユーザー名/パスワードを入力してログインボタンをクリックするサイトがあります。ログイン ボタンは XMLHttpRequest オブジェクトを作成し、それを起動します。

Chrome、Firefox、Opera、Safari、Android デバイス、iOS デバイスでは問題なく動作します。HTTP アドレスを使用し、HTTPS を使用していない限り、IE9 は問題なく動作します。

HTTPS では、IE9 は次のように動作します。

最初のログイン リクエストでは、何も返されません。F12 画面のネットワーク タブにログイン リクエストが表示され、すべて正しく表示されます。スクリプト タブでエラーが発生することはありません。単に何も起こりません。

ここにクレイジーな部分があります: - ログインを 2 回クリックすると、実際に機能します。- ブラウザで [更新] をクリックしてからログインすると、同様に機能します。

私は次のように要求を行っています。

   var x = new XMLHttpRequest();
   x.open("POST", "/Relative/URL/Path", true);
   x.setRequestHeader("Content-Type", "text/plain");
   x.onreadystatechange = function () {
      if ((x.readyState == 4) && (x.status == 200)) {
            // handle callback
      }
   }
   x.send(my request);

これが失敗すると、デバッガーは x.send() 行から onreadystatechange コードに移動します。readyState は 1 になります。他に何も起こらないため、デバッグできるのはこれが最後になります。

どんなアイデアでも大歓迎です。

[編集]: 何が起こるかを確認するために、1 つの要求を行かせました。onreadystatechange イベントは、readyState = 4 および status = 12152 で再び発生しました。IE9 の F12 画面のネットワーク ビューには、結果が Aborted として表示され、所要時間が 1589.07 秒として表示されます。Google で検索すると、これはサーバーで接続が閉じられたことを意味します。

[編集 2]: 以下のコメントに基づいて、jQuery の ajax() メソッドを使用するようにこのコードを修正しました。これにより、私の側の悪いコードを排除できる可能性があると思いました。そのような幸運はありません。同じ現象が発生します。

   $.ajax({
      "url": sUrl,
      "success": function (data, textStatus, x) {
         workerCallback(data, id, "");
      },
      "error": function (x, testStatus, errorThrown) {
         workerCallback("nc", id, errorThrown);
      },
      "contentType": "text/plain",
      "data": JSON.stringify(req),
      "dataType": "json",
      "timeout": 1600000,
      "type": "POST"
   });

[最終更新:] コードを更新しました。タイムアウトが発生した場合は、同じリクエストを 1 回だけ再送信するだけです。かなりのハックですが、機能します。誰かが解決策を見つけない限り、私は賞金を以下の人々が持っていたいくつかの役立つアイデアに分けます.

4

3 に答える 3

1

これは奇妙な問題のように思われ、https サイトのコードを調べずにテストするのは困難です。

迅速な修正が必要な場合は、最初の (ダミーの) リクエストを実行してから、短い setTimeout ですぐに中止し、2 番目の (実際の) リクエストを行うことができます。

あなたの説明によれば、それはうまくいくはずです。

于 2012-10-07T12:57:20.243 に答える
0

これが通過した最初のリクエストのデバッグ中に

ここに画像の説明を入力

この正確なエラーに関連する投稿があります... IE 9 Javascript error c00c023f

作者は onreadystatechange ハンドラに以下を入れました

if (xmlHttpRequest.aborted==true) { 
  stopLoadAnimation();
  return;
}

これにより、正しい方向に進むことができます。

于 2012-10-04T14:37:43.743 に答える
0
    関数 cb()
      {
      if ( (this.readyState === 4) && (this.status === 200) )
        {
        // コールバックを処理します
        }
      }

    onreadystatechange = cb;
于 2012-10-09T20:55:16.963 に答える