为什么IE不显示此警报()?

时间:2010-03-15 22:54:49

标签: javascript internet-explorer xmlhttprequest alert

我有以下代码:

// setup the AJAX request
var pageRequest = false;
if(window.XMLHttpRequest)     pageRequest = new XMLHttpRequest();
else if(window.ActiveXObject) pageRequest = new ActiveXObject("Microsoft.XMLHTTP");

// callback
pageRequest.onreadystatechange = function() {

    alert('pageRequest.readyState: ' + pageRequest.readyState
        + '\npageRequest.status: ' + pageRequest.status);
}

pageRequest.open('POST','ajax.php',true);

// q_str contains something like 'data=value...'

pageRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
pageRequest.setRequestHeader("Content-length", q_str.length);
pageRequest.setRequestHeader("Connection", "close");

pageRequest.send(q_str);

这在Chrome中工作得很好,但是IE会扼杀它,吐出“未指定的错误”。它指向带有alert()的行。为什么不能显示警报?

编辑:好的,在我关闭错误对话框后,我按预期得到了三个警告....

编辑:现在真的变得很奇怪了。如果我改变

alert('pageRequest.readyState: ' + pageRequest.readyState
        + '\npageRequest.status: ' + pageRequest.status);

alert('pageRequest.readyState: ' + pageRequest.readyState);

然后它工作,我得到5个警报。 (1,1,2,3,4)

3 个答案:

答案 0 :(得分:1)

状态是HTTP响应,前两次调用该方法,返回1和1作为readyState。 readyState 1表示"The object has been created, but the send method has not been called."。此时,服务器没有状态响应,因为它没有收到任何请求,因此在警报中使用状态会给您一个错误。

答案 1 :(得分:1)

Chrome 4也会引发错误(INVALID_STATE_ERR:DOM异常11)。如果您打开Chrome Javascript控制台,则会看到错误。

Firefox 3.6也会引发错误,但似乎默默地丢弃它(它在错误控制台中不可见)。如果将函数包装在try..catch块中,您将看到错误消息(组件返回失败代码:0x80040111(NS_ERROR_NOT_AVAILABLE)):

pageRequest.onreadystatechange = function() {
  try {
    alert('pageRequest.readyState: ' + pageRequest.readyState
          + '\npageRequest.status: ' + pageRequest.status);
  }
  catch (e) { 
    alert(e); 
  }
}

在Internet Explorer中调用前两次onreadystatechangereadyState为1(已打开)。在此状态下,正在发送请求,但尚未收到响应。调用此status中的readyState属性时会引发错误,因为没有HTTP响应来读取状态。

此行为与W3C XMLHttpRequest specification的旧版本兼容,状态为:

  

如果status属性不是   可用它必须提出异常。   它必须在readyState时可用   是3(接收)或4(已加载)。什么时候   可用,它必须代表HTTP   状态代码(通常为200   成功的联系)。

     

检索例外

     

如果访问此属性,应该引发DOMException INVALID_STATE_ERR   当readyState具有不适当的值时。

但是,规范的

Newer versions声明status必须始终返回一个值:

  

status属性必须返回   运行这些步骤的结果:

     
      
  1. 如果状态为UNSENT或OPENED,则返回0并终止这些步骤。
  2.   
  3. 如果错误标志为真,则返回0并终止这些步骤。
  4.   
  5. 返回HTTP状态代码。
  6.   

答案 2 :(得分:0)

在评估PageRequest.status(这是一个整数)时,我认为你有一个字符串连接问题。试试这个:

status = pageRequest.status;
status += '';
alert('pageRequest.readyState: ' + pageRequest.readyState \
+ '\npageRequest.status: ' + status);