【问题标题】:Why isn't IE displaying this alert()?为什么 IE 不显示此警报()?
【发布时间】:2011-01-27 21:45:22
【问题描述】:

我有以下代码:

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

【问题讨论】:

  • 您确定 pageRequest 的构造正确吗?如果你在本地运行这个 IE 默认拒绝对本地页面使用 ActiveX....
  • 我在我的本地网络服务器上运行它。
  • 你可以忍受 ;在你的 } 之后。也许这是相关的。

标签: javascript internet-explorer xmlhttprequest alert


【解决方案1】:

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

【讨论】:

  • 感谢您终于解释了为什么此警报会产生错误。我想知道为什么它可以在 Chrome 和 FF 中运行...
  • [Off-topic] 看到 Paper Clippy 头像没有以“看起来你正在尝试......”开头的答案,有点失望:(
  • 内心深处每个人都喜欢 Clippy。 (好的,非常深入)
【解决方案2】:

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

此行为与旧版本的W3C XMLHttpRequest specification 兼容,其中指出:

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

检索异常

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

规范的Newer versions,然而,声明status必须总是返回一个值:

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

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

【讨论】:

  • 好的。是的,我有点忘了 Chrome 中的错误控制台。它也会弹出修改标题的错误,所以我只是忽略了控制台。我的错。
【解决方案3】:

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

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

【讨论】:

  • 这与字符串连接无关。 string + integer 的结果是将integer 转换为字符串,然后将其连接起来。此外,Javascript 不需要为续行转义。第三行末尾的反斜杠只会导致语法错误(无效字符)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 2013-01-28
相关资源
最近更新 更多