【问题标题】:IE9 AJAX error: "Could not complete the operation due to error c00c023f"IE9 AJAX 错误:“由于错误 c00c023f 无法完成操作”
【发布时间】:2012-09-13 21:20:31
【问题描述】:

我有一个运行 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//
}

我已经搜索过它并找到了this post on stack。从那里,我找到了this quote

就在你调用 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 错误时显示消息。

【问题讨论】:

    标签: javascript ajax internet-explorer xmlhttprequest


    【解决方案1】:

    我猜,但我认为缺少 readyState 检查可能会给您带来一些问题。请记住,您不只是在调用完成时调用 onReadyStateChange 处理程序 - 它会在每次状态更改时调用。所以对于前两个(Unitialized 和 Loadinf),我不相信“status”属性可用 - 由于 ActiveX 和 JavaScript 之间的交互,IE 可能会抛出一个奇怪的错误。

    我会为您的错误状态建议这样的事情(请注意,除了 500 之外,您可能还想捕获许多错误):

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

    我只能猜测其他浏览器一开始就创建了 status 属性(如果这确实是问题的话)。

    顺便说一句,我还可以(谦虚地)建议您尝试一下我的 AJAX 抽象库。它会自动处理几乎所有这些。成功和错误处理程序都可以设置,不用担心跨浏览器的问题,而且这一切都非常适合您现有的代码库。

    组件在这里:

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

    我发现它非常有用。

    【讨论】:

    • 感谢您的回答,我确实会看看您的 AJAX 库。
    【解决方案2】:

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

    我敢打赌 divToChange 没有引用有效的 HTML div 元素,并且您的错误来自尝试更改 div 本身。

    在你的调试代码中,添加console.log(divToChange)(或者你可以使用alert(divToChange)。它应该写成"[object HTMLDivElement]或类似的东西。

    在您的测试中,如果您想确保divToChange 不是错误的[1],只需这样做

     if (divToChange)
    

    [1] 如果您来自强类型环境,则 JavaScript 对 falseytruthy 的定义可能需要一些时间才能使用。

    【讨论】:

    • 根据您的回答,我查看了我的代码,确实发现在我为状态消息创建容器 div 之前调用了我的 Ajax 函数。我不知道它在 Chrome/Firefox 上是如何工作的,有时在 IE 上是如何工作的,但无论如何,我已经修复了它,现在看起来还可以。谢谢:)
    【解决方案3】:

    我已经尝试过了,它对我有用。希望这会有所帮助:

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

    【讨论】:

      猜你喜欢
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      • 2012-04-28
      • 2013-04-16
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      相关资源
      最近更新 更多