2

我有以下代码:

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

4

3 回答 3

1

状态是 HTTP 响应的前两次方法被调用你得到 1 和 1 作为 readyState。readyState 1 表示“对象已创建,但尚未调用 send 方法。” . 当时服务器没有状态响应,因为它没有收到任何请求,因此在警报中使用状态会给您一个错误。

于 2010-03-15T23:18:16.817 回答
1

Chrome 4 也会引发错误(INVALID_STATE_ERR: DOM Exception 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(已打开)。在这种状态下,请求正在发送,但尚未收到响应。调用statusthis 中的属性时会引发错误,readyState因为没有 HTTP 响应可以从中读取状态。

此行为与旧版本的W3C XMLHttpRequest 规范兼容,该规范指出:

如果status属性不可用,它必须引发异常。它必须在readyState 3(接收)或 4(加载)时可用。如果可用,它必须表示 HTTP 状态代码(通常为 200 表示成功连接)。

检索例外

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

然而,较新版本status的规范声明必须始终返回一个值:

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

  1. 如果状态为 UNSENT 或 OPENED,则返回 0 并终止这些步骤。
  2. 如果错误标志为真,则返回 0 并终止这些步骤。
  3. 返回 HTTP 状态码。
于 2010-03-15T23:24:41.680 回答
0

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

status = pageRequest.status;
status += '';
alert('pageRequest.readyState: ' + pageRequest.readyState \
+ '\npageRequest.status: ' + status);
于 2010-03-15T23:24:59.840 回答