0

PHP スクリプトを実行する AJAX リクエストがあり、リクエストが状態 500 を返す状況を処理したいと考えています。

私のコードは Chrome と Firfox で動作していますが、IE9 で条件を追加すると、次のif(httpRequest.status==500)JavaScript エラーが発生します。

Could not complete the operation due to error c00c023f.

ページに読み込み中の画像がありますが、このエラーのために画像を置き換えることができず、ページは読み込み続けているようです。ここで引用されているように:

特に、リクエストの実行中に「読み込み中のアニメーション」などを表示している場合。私の場合の結果は、ページの読み込みが停止しないように見えたということでした

まず、私の AJAX 呼び出しコードは次のとおりです。

function sendRequest(url, params, divToChange)
{

  // code for IE7+, Firefox, Chrome, Opera, Safari
  if (window.XMLHttpRequest)
  {
      var httpRequest = new XMLHttpRequest();
  }   
  else // code for IE6, IE5
  {
      var httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
  }

  //open the request and prepare variables for the PHP method being activated on server side//
  httpRequest.open("POST", url, true); 

  //Set request headers for POST command//
  httpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

  if(divToChange != "false")
  {
      httpRequest.onreadystatechange=function()
      {
          if(httpRequest.readyState==4 && httpRequest.status==200)
          {
              document.getElementById(divToChange).innerHTML=httpRequest.responseText;
              eval(document.getElementById("runscript").innerHTML);
          }
          else if (httpRequest.status==500)
          {
              document.getElementById(divToChange).innerHTML=httpRequest.responseText;

              //eval the lang variable from the php script.
              eval(document.getElementById("runscript").innerHTML); 

              if(lang == "en")
              {
                  document.getElementById(divToChange).innerHTML='<b> An error accured, please try again later</b>';
              }
              else
              {
                  document.getElementById(divToChange).innerHTML='<b> שגיאה התרחשה, בבקשה נסה שנית מאוחר יותר</b>';
              }     
          } 
      }  
  }

  httpRequest.send(params); //sending the request to the server//
}

私はそれについて検索し、スタックでこの投稿を見つけました。そこから、私はこの引用を見つけました:

XmlHttpRequest.abort() メソッドを呼び出す直前に、それにフラグを設定します。これが私が行った方法です。

XmlHttpRequest.aborted = true;
XmlHttpRequest.abort();
In the onreadystatechanged handler, the first lines of code in my case is:
if (xmlHttpRequest.aborted==true) { 
  stopLoadAnimation();
  return;
}

しかし、私の場合、 を呼び出すことさえXmlHttpRequest.abort()しないのに、なぜそもそもエラーが発生するのでしょうか?

ちなみに、すべての条件else if (httpRequest.status==500)とその中のすべてのコードを削除すると、エラーは発生しませんが、500 エラーでメッセージを表示できなくなります。

4

3 に答える 3

1

推測ですが、readyState チェックがないために問題が発生している可能性があります。呼び出しが完了したときに onReadyStateChange ハンドラーを呼び出すだけでなく、状態が変化するたびに呼び出されることに注意してください。したがって、最初の 2 つ (Unitialized と Loadinf) については、"status" プロパティが利用できるとは思えません。また、ActiveX と JavaScript の間の相互作用が原因で、IE が奇妙なエラーをスローしている可能性があります。

エラー状態には次のようなものをお勧めします(500以外にもキャッチしたいエラーがたくさんあることに注意してください):

(httpRequest.readyState > 1 && httpRequest.status != 200)

他のブラウザーが最初に status プロパティを作成しているとしか思えません (これが実際に問題である場合)。

余談ですが、私の AJAX 抽象化ライブラリを試してみることを (謙虚に) 提案するかもしれません。このほとんどすべてを自動的に処理します。成功ハンドラーとエラー ハンドラーの両方を設定できます。クロス ブラウザーに関する心配はなく、すべて既存のコードベースに非常にシームレスに適合します。

コンポーネントは次のとおりです。

http://depressedpress.com/javascript-extensions/dp_ajax/

めちゃめちゃ便利だと思いました。

于 2012-09-14T04:07:42.653 に答える
0

IE は、innerHTML を使用して理解できない無効なマークアップを作成すると、非常に奇妙なことを行います。(たとえば、誰かがフォームをフォーム内に埋め込もうとしているときに、非常によく似た問題に遭遇しました。)

有効な HTML要素をdivToChange参照していないこと、およびエラーが div 自体を変更しようとしたことが原因であることに賭けます。div

デバッグコードに追加しますconsole.log(divToChange)(または使用できますalert(divToChange)"[object HTMLDivElement]

テストで、それが誤りdivToChangeでないことを確認したい場合[1]、単純に

 if (divToChange)

[1] Javascript のfalseyandの定義はtruthy、厳密に型指定された環境から来た場合、慣れるまでに時間がかかる場合があります。

于 2012-09-13T23:13:36.657 に答える
0

私はこれを試してみましたが、うまくいきました。お役に立てれば:

if (xmlhttp.readyState==1 ) { return }     // added this to fix error c00c023f in IE9
                else if (xmlhttp.readyState==4 )
                    {
                        if(xmlhttp.status==200) { func(xmlhttp.responseText) }
                    }
于 2015-02-12T04:21:23.450 に答える