我有以下代码:

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

有帮助吗?

解决方案

状态是HTTP响应所述第一两次调用该方法你回到1和1作为readyState的。 readyState的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); 
  }
}

前两次 onreadystatechange 在 Internet Explorer 中调用, readyState 是 1(打开)。在此状态下,正在发送请求,但尚未收到响应。调用时会引发错误 status 财产在这 readyState 因为没有可从中读取状态的 HTTP 响应。

此行为与旧版本兼容 W3C XMLHttpRequest 规范, , 哪一个州:

如果 status 属性不是 则必须引发异常。它必须在以下情况下可用: readyState 是 3(接收)或 4(加载)。何时 必须代表 HTTP 状态代码(通常为 成功连接)。

检索异常

DOM异常 INVALID_STATE_ERR 如果访问该属性,则应引发 当 readyState 的值不合适时。

新版本 然而,该规范指出 status 必须始终返回一个值:

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

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

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

status = pageRequest.status;
status += '';
alert('pageRequest.readyState: ' + pageRequest.readyState \
+ '\npageRequest.status: ' + status);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top