gpt4 book ai didi

javascript - XHR 可以多次触发 readyState=DONE 的 onreadystatechange 吗?

转载 作者:数据小太阳 更新时间:2023-10-29 05:02:51 33 4
gpt4 key购买 nike

W3C spec建议执行以下操作:一些简单的代码来处理从网络上获取的 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 的值相同。我猜这种行为是正确的,因为规范说明每次状态更改都必须触发事件,并且 readyState 必须始终等于当前状态,因此如果多个事件堆积在事件队列中,很明显,一个 readyState == 4 将得到多个调用。

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

这个来自 w3c 的例子似乎被复制并粘贴到网络的多个地方——特别是 OpenSocial 似乎以这种方式处理 xhr 事件。是否正确?

最佳答案

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

为了让它也始终在 Debug模式下工作,我找到了两个选项:

  1. 使用onload 验证XMLHTMLRequest 是否成功W3C Spec

    client.onload = handler;

    此版本不适用于 IE8。它必须是实现 XMLHttpRequestEventTarget 的浏览器界面

  2. 一旦您处于 DONE 200 状态,请删除 onreadystatechange 处理程序。

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

我还在 Chromium 中打开了一个问题对于这个问题,提供您的 Fiddle (谢谢!)

关于javascript - XHR 可以多次触发 readyState=DONE 的 onreadystatechange 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12761255/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com