XHR 可以在readyState=DONE 的情况下多次触发onreadystatechange 吗?

2024-05-22

The W3C spec http://www.w3.org/TR/XMLHttpRequest/#event-xhr-readystatechange建议以下实施: 一些简单的代码可以对通过网络获取的 XML 文档中的数据执行某些操作:

function processData(data) {
  // taking care of data
}

function handler() {
  if(this.readyState == this.DONE) {
    if(this.status == 200 &&
       this.responseXML != null &&
       this.responseXML.getElementById('test').textContent) {
      // success!
      processData(this.responseXML.getElementById('test').textContent);
      return;
    }
    // something went wrong
    processData(null);
  }
}

var client = new XMLHttpRequest();
client.onreadystatechange = handler;
client.open("GET", "unicorn.xml");
client.send();

这个实现真的正确吗?

在调试过程中,我发现readystatechanged事件处理程序被连续多次调用,并且readyState == 4的值相同。我想这种行为是正确的,因为规范说每次状态更改都必须触发该事件,并且readState 必须始终等于当前状态,因此,如果事件队列中堆积了多个事件,则很明显,将收到多次调用 readState == 4。

http://jsfiddle.net/44b3P/ http://jsfiddle.net/44b3P/-- 这是上面的示例,在发送请求后添加了调试器调用以暂停执行,并在 processData 中添加了alert()。一旦您取消暂停执行,您将收到 3 个警报。

这个来自 w3c 的示例似乎被复制并粘贴到网络中的多个位置——特别是 OpenSocial 似乎以这种方式处理 xhr 事件。这是对的吗?


在 Chrome 开发者工具中进行调试时,我也看到了相同的行为(DONE 200 被击中不止一次,即 2...n 次)。

为了使其始终在调试模式下工作,我找到了两个选项:

  1. Use onload验证 XMLHTTPRequest 是否成功W3C Spec http://www.w3.org/TR/XMLHttpRequest/#event-handlers

    client.onload = 处理程序;

    该版本无法在 IE8 中运行。它必须是一个实现了XMLHttpRequestEventTarget http://www.w3.org/TR/XMLHttpRequest/#xmlhttprequesteventtarget界面

  2. 去除onreadystatechange一旦你有一个处理程序DONE 200 state.

    client.onreadystatechange = function() {
        // check if request is complete
        if (this.readyState == this.DONE) {
            if (this.onreadystatechange) {
                client.onreadystatechange = null;
                handler();
            }
        }
    };
    

我还提出了一个问题Chromium http://code.google.com/p/chromium/issues/detail?id=162837对于这个问题,提供您的Fiddle http://jsfiddle.net/44b3P/(谢谢!)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XHR 可以在readyState=DONE 的情况下多次触发onreadystatechange 吗? 的相关文章

随机推荐