为什么XMLhttprequest的readystate错误会导致onreadystatechange多次触发
Admin 2023-04-03 群英技术资讯 1204 次浏览
这篇文章主要介绍了“为什么XMLhttprequest的readystate错误会导致onreadystatechange多次触发”相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇为什么XMLhttprequest的readystate错误会导致onreadystatechange多次触发文章都会有所收获,下面我们一起来看看吧。最近做到一个页面需要兼容IE,然后就写了一个原生 XMLhttprequest请求
直接上错误代码
xmlHttp = new XMLHttpRequest();
xmlHttp.open("post","https://baidu.com/mianxiang/baidu/biancheng");
xmlHttp.setRequestHeader("Content-Type","application/json");
xmlHttp.send(XXXXXXXXXX) ;
xmlHttp.onreadystatechange = function () {
if(this.status==200){
console.log("responseText",this.responseText);
}
};
在上面代码中,当status == 200 的console.log内容每次请求,都会在控制台打印两次,也就是说里面的逻辑会被执行两次,百度了很多都没有发现相似问题,和具体解决办法。
xmlHttp = new XMLHttpRequest();
xmlHttp.open("post","https://baidu.com/mianxiang/baidu/biancheng");
xmlHttp.setRequestHeader("Content-Type","application/json");
xmlHttp.send(XXXXXXXXXX) ;
xmlHttp.onreadystatechange = function () {
if(xmlHttp.readyState == 4 && this.status==200){
console.log("responseText",this.responseText);
}
};
最后偶然发现了和正确代码的差距,补上“ xmlHttp.readyState == 4 ”
执行一次,问题解决。
分析,可能是因为在没有添加判断readyState时,当options预请求执行时,也会有一次状态码200的,所以会被执行两次,但是疑惑点是预请求不会返回数据,但是在打印时,两次打印都是有数据的。
查资料+请教大佬 = get 知识
知识:
此阶段确认XMLHttpRequest对象是否创建,并为调用open()方法进行未初始化作好准备。
值为0表示对象已经存在,否则浏览器会报错--对象不存在。
此阶段对XMLHttpRequest对象进行初始化,即调用open()方法,根据参数(method,url,true)完成对象状态的设置。
并调用send()方法开始向服务端发送请求。值为1表示正在向服务端发送请求。
此阶段接收服务器端的响应数据。但获得的还只是服务端响应的原始数据,并不能直接在客户端使用。
值为2表示已经接收完全部响应数据。并为下一阶段对数据解析作好准备。
此阶段解析接收到的服务器端响应数据。
即根据服务器端响应头部返回的MIME类型把数据转换成能通过responseBody、responseText或responseXML属性存取的格式,为在客户端调用作好准备。
状态3表示正在解析数据。
此阶段确认全部数据都已经解析为客户端可用的格式,解析已经完成。
值为4表示数据解析完毕,可以通过XMLHttpRequest对象的相应属性取得数据。
这个时候再回顾之前为何执行两次onreadystatechange, 因为当state每次变化的时候都会执行到onreadystatechange,其实是readyState每次变化都会有执行onreadystatechange,因为我判断了this.status == 200 ,所以当服务器响应了之后返回了200的状态码,才会执行console.log(),才有上面的执行两次的问题。
至此问题解决!!!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
teleport 传送门组件,提供一种简洁的方式,可以指定它里面的内容的父元素,也就是说teleport 中的内容允许我们控制在任意的DOM中,使用简单,对VUE 3 teleport传送门相关知识感兴趣的朋友一起看看吧
这篇文章给大家分享的是用JavaScript怎样实现一个日期倒计时的功能。小编觉得挺实用的,因此分享给大家做个参考,文中的示例代码介绍得很详细,有需要的朋友可以参考,接下来就跟随小编一起学习一下吧。
这篇文章主要介绍了uni-app 的自定义组件,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
什么是Angular cli?本篇文章带大家了解一下Angular中的Angular cli,介绍一下Angular cli的使用方法,希望对大家有所帮助!
这篇给大家分享的一个JavaScript中for循环使用的示例,需求是实现从1加到50的计算,文中示例代码介绍的非常详细,对大家学习for循环的使用有一定的参考价值,感兴趣的朋友接下来一起跟随小编看看吧。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008