You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XMLHttpRequest的readystatechange事件失效问题求助

问题根源与解决方案

问题和Chrome浏览器无关,是你代码里的逻辑错误:你把request.open()和request.send()放进了readystatechange的事件回调函数内部。

这个回调只有在XMLHttpRequest的状态发生变化时才会执行,但你还没调用open和send,请求根本没启动,状态不会有任何变化,回调自然不会触发,请求永远发不出去。换成document的click事件后,点击文档时会执行回调里的open和send,请求才正常发起,所以功能能运行。

修正后的代码应该把open和send移到事件监听外面,先绑定事件,再发起请求:

const getData = (source) => {
    return new Promise((resolve, reject) => {
        const request = new XMLHttpRequest();
        request.addEventListener('readystatechange', () => {
            if (request.readyState === 4 && request.status === 200) {
                let todos = JSON.parse(request.responseText);
                resolve(todos);
            } else if (request.readyState === 4) {
                reject('An error occured!');
            }
        });
        // 将请求发起代码移到事件监听外部
        request.open('GET', source);
        request.send();
    });
};

getData('https://jsonplaceholder.typicode.com/todos')
    .then((data) => console.log(data))
    .catch((err) => console.log(err));

另外,你也可以用load事件替代readystatechange,它只会在请求成功完成时触发,逻辑更简洁,还可以搭配error事件处理网络层面的错误:

const getData = (source) => {
    return new Promise((resolve, reject) => {
        const request = new XMLHttpRequest();
        request.addEventListener('load', () => {
            if (request.status === 200) {
                let todos = JSON.parse(request.responseText);
                resolve(todos);
            } else {
                reject('An error occured!');
            }
        });
        request.addEventListener('error', () => {
            reject('Network error occurred!');
        });
        request.open('GET', source);
        request.send();
    });
};

内容的提问来源于stack exchange,提问作者mr.sun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 01:32:05