AJAX问题之XMLHttpRequest status = 0

来源:互联网 发布:知乎离线下载 编辑:程序博客网 时间:2024/05/17 07:58

         AJAX问题之XMLHttpRequest status = 0

标签: xmlhttprequestajaxstatus 0http协议xmlhttp.status
21681人阅读 评论(25)收藏举报
分类:

其实这篇文章要写的不止是XMLHttpRequest status = 0 这个问题,还有我重新看AJAX遇到的一些问题和自己的反思。


先看整个例子:

[html] view plain copy
print?
  1. <html>  
  2. <head>  
  3. <script type="text/javascript">  
  4.     var xmlhttp;  
  5.     function loadXMLDoc(url) {  
  6.         xmlhttp = null;  
  7.         if (window.XMLHttpRequest) {// code for all new browsers  
  8.             xmlhttp = new XMLHttpRequest();  
  9.         } else if (window.ActiveXObject) {// code for IE5 and IE6  
  10.             xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");  
  11.         }  
  12.   
  13.         if (xmlhttp != null) {  
  14.             xmlhttp.onreadystatechange = state_Change;  
  15.             xmlhttp.open("GET", url, true);  
  16.             xmlhttp.send(null);  
  17.         }  
  18.     }  
  19.   
  20.     function state_Change() {  
  21.         if (xmlhttp.readyState == 4) {  
  22.             alert(xmlhttp.status);  
  23.             alert(xmlhttp.responseText);  
  24.             if (xmlhttp.status == 200) {  
  25.                 alert("200");  
  26.             } else {  
  27.                 alert(xmlhttp.status);  
  28.                 alert("Problem retrieving XML data");  
  29.             }  
  30.         }  
  31.     }  
  32. </script>  
  33. <title>Document</title>  
  34. <button onclick="loadXMLDoc('file:///E:/test2.html')">click</button>  
  35. </head>  
  36. <body>  
  37. </body>  
  38. </html>  


1、为什么是xmlhttp.onreadystatechange = state_Change而不是xmlhttp.onreadystatechange = state_Change();

调用函数不是要用()写明的吗?难道它会根据函数名去找函数?问了几个前端的,感觉对这个都是模模糊糊也不懂真正的原因在哪里,最后还是去请教了另外一位师兄。


为的是把整个函数给onreadystatechange,而不是将函数最后处理完的值返回给onreadystatechange。


再来理一遍思路,XMLHttpRequest对象是在我最近在重看xml的教程时看到了,立刻和AJAX联系在一起。

w3c这样描述,它用于后台与服务器交换数据,是开发者的梦想


现在的浏览器直接可以通过new拿到对象,但是IE就不可以了,xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

同时在IE6运行的时候浏览器会提示你设置ActiveX。


onreadystatechange是一个事件句柄,同样功能的还有onclick这些,就是有点击事件的时候会进行特定处理,具体看你的函数怎么写了。而onreadystatechange是由readyState触发,readyState存着XMLHttpRequest的状态,

 0: 请求未初始化
 1: 服务器连接已建立
 2: 请求已接收
 3: 请求处理中
 4: 请求已完成,且响应已就绪

readyState改变,调用onreadystatechange这个函数,注意,是这个函数,那我们是不是要赋值一个函数给他,而不是单纯地返回一个值。


所以,问题解决了。

同时不同于:

[html] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. <button onclick="dodo()">click</button>  
这个是HTML里面的,虽然也是事件句柄,但是格式不同。上面那个是在JS代码里面的。


2、XMLHttpRequest status = 0 问题。

xmlhttp.readyState =4的时候,一直xmlhttp.status != 200。便随手输出,发现xmlhttp.status=0,http协议里可是没这个状态码的。最后翻啊翻啊,找啊找啊,最后找到一个XMLHttpRequest的说明:http://www.w3.org/TR/XMLHttpRequest/

The status attribute must return the result of running these steps:

status的值一定会返回运行这些步骤的结果。


1、If the state is UNSENT or OPENED, return 0.(如果状态是UNSENT或者OPENED,返回0)
2、If the error flag is set, return 0.(如果错误标签被设置,返回0)
3、Return the HTTP status code.(返回HTTP状态码)



如果在HTTP返回之前就出现上面两种情况,就出现0了。

先说两个button,一个是url是:file:///E:/test2.html,另外一个是:http://www.baidu.com。


第一个button的url访问只是本地打开没有通过服务器,自己可以用Wireshark捉包(感谢某位高人指点)。

这里面还有一个问题,就是xmlhttp.readyState一直会变,

1: 服务器连接已建立

2: 请求已接收 

3: 请求处理中 

4: 请求已完成,且响应已就绪。

以这种情况看的话,应该是xmlhttp自己在模拟,因为根本就没通过服务器。本地直接打开而已。OPENED了,所以status为0。


第二个button的url访问虽然是其他域名,抓包是有的,但是,这是跨域访问了,

If the cross-origin request status is network error

    This is a network error.

虽然去访问了,应该是浏览器跨域的返回头没有允许,所以浏览器阻止,Access-Control-Allow-Origin这个属性。


真确的方法是在自己的服务器,访问自己域名内的url。

在tomcat上跑:

[html] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. <button onclick="loadXMLDoc('http://localhost:8080/TestServlet/MyServlet')">click</button>  

最后我在反思,我自己一直在寻求问题的答案,但是问其中一些人的时候,只是给出了自己随手百度而来的答案,有些人,甚至我说加括号之后有错了之后就不再理会这个问题,会用就行了。但是我不止于这种答案,还是去问了一个师兄,因为,这位师兄前端了得,重要的是,是一位技术爱好者,就是他把第一个问题的分析给我听,后面自己去Google再深入。


搞技术的差距,大概于此,现在可能差距不大,但是几年之后,估计就不是一个级别了。

人之差距,也是如此罢了。


最后要感谢另外一个人,他让我见识到了了一个全栈工程师的。前后端通杀,底层也会,业务逻辑也会。几句话能把我下午查的东西串联起来,所谓真正的程序员,也是如此。与他的一番谈话,很是兴奋,也甚是佩服。热爱技术的人,不过与此。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 学习瑜伽教练口令好复杂怎么办 练瑜伽腿的柔韧性不够怎么办 瑜伽扭转时手抓不到脚怎么办 练瑜伽腿部太硬怎么办 褶皱衣服不紧了怎么办 吃撑了肚子涨怎么办 正好压本科线该怎么办 大脚趾被砸了怎么办 脊柱侧弯每天疼怎么办 内衣扣的位置脊柱疼怎么办 练完瑜伽颈椎疼怎么办 乳胶枕头太高了怎么办 枕头太高脖子痛怎么办 颈椎突出症状缓解后怎么办 外痔疼的的历害怎么办 小肚子疼得历害怎么办 练瑜伽伤到颈椎怎么办 鼻子干口干胃烧怎么办 颈椎病压迫神经引起手麻怎么办 4个月婴儿睡觉少怎么办 晚上睡觉睡不好老是醒来怎么办 吃了没熟的香蕉怎么办 70岁父母老吵架怎么办 怀孕七个月晚上睡不着怎么办 九个月宝宝睡眠不好怎么办 一个月的宝宝放不下怎么办 宝宝被吓了发烧怎么办 体内火气重睡不着觉怎么办 宝宝睡觉一直翻身发出声音怎么办 严重失眠怎么办整夜睡不着觉 腿疼得睡不着觉怎么办 19岁晚上睡不着该怎么办 工作累的想哭怎么办 心累迷茫想哭怎么办 白天很累晚上又睡不着怎么办 发型睡觉压乱了怎么办 通宵一夜第二天怎么办 夏天了腿脚还凉怎么办 咖啡色三天了月经还是下不来怎么办 睡觉姿势不对腰疼怎么办 来月经吃了香瓜怎么办