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

我已经搜索过它并在 stack 上找到了这篇文章。从那里,我找到了这句话

就在您调用 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 处理程序 - 它会在每次状态更改时调用。因此,对于前两个(Unitialized 和 Loadinf),我不相信“状态”属性可用 - 由于 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

当您对innerHTML 使用过多并创建它无法理解的无效标记时,IE 会做一些非常奇怪的事情。(例如,我遇到了一个非常相似的问题,有人试图在表单中嵌入表单。)

我敢打赌,divToChange它没有引用有效的 HTMLdiv元素,并且您的错误来自尝试更改 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 回答