关于onreadystatechange属性(转)

在编写Ajax方法的时候,我们经常会写上类似于这样的代码:

Javascript代码
  1. <script type="text/javascript">
  2. var xmlHttp;
  3. //创建一个XmlHttpRequeset对象
  4. function createXMLHttpRequest()...{
  5. if(window.ActiveXObject)...{
  6. xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
  7. }
  8. else if(window.XMLHttpRequest)...{
  9. xmlHttp = new XMLHttpRequest();
  10. }
  11. }
  12. //开始一个请求
  13. function startRequest()...{
  14. createXMLHttpRequest();
  15. xmlHttp.onreadystatechange = handlestatechange;
  16. xmlHttp.open("GET", "SimpleRespose.xml", true);
  17. xmlHttp.Send(null);
  18. }
  19. function handlestatechange()...{
  20. if(xmlHttp.readyState == 4)...{//描述一种"已加载"状态;此时,响应已经被完全接收。
  21. if(xmlHttp.status == 200)...{//200表示成功收到
  22. alert("The Server Replied with:" + xmlHttp.responseText)
  23. }
  24. }
  25. }
  26. </script>
<script type="text/javascript">
var xmlHttp;
//创建一个XmlHttpRequeset对象
function createXMLHttpRequest()...{
if(window.ActiveXObject)...{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest)...{
xmlHttp = new XMLHttpRequest();
}
}
//开始一个请求
function startRequest()...{
createXMLHttpRequest();
xmlHttp.onreadystatechange = handlestatechange;
xmlHttp.open("GET", "SimpleRespose.xml", true);
xmlHttp.Send(null);
}
function handlestatechange()...{
if(xmlHttp.readyState == 4)...{//描述一种"已加载"状态;此时,响应已经被完全接收。
if(xmlHttp.status == 200)...{//200表示成功收到
alert("The Server Replied with:" + xmlHttp.responseText)
}
}
}
</script>

第一次阅读这段代码的时候,我就感到了一点点不对劲,但是说不出来什么地方不对劲。随着对Ajax代码的进一步了解,这种感觉时刻伴随着我。

后来,我知道了这种感觉来自于什么地方。

看看startRequest函数。我们发现xmlHttp.onreadystatechange指向了一个函数,这个函数是在xmlHttpRequest.readyState发生改变的时候触发。我们再来看startRequest函数,想象一下整个请求发送的步骤。现在我们点击一个按钮,触发了一个startRequest函数。函数往下走,第一步是createXmlHttpRequest(),它的作用是创建一个xmlHttpRequest对象,当它完毕的时候,xmlHttpRequest.readyState的值是0(window.alert跟踪得到的),程序继续往下走,xmlHttp.onreadystatechange = handlestatechange,因为状态没有改变(xmlHttpRequest.readyState的值是0),所以不触发函数,紧接着是Open()和Send(),那么,整个函数从头到尾都应该没有触发handlestatechange函数啊,但是为什么出来的结果是正确的呢?

后来我用window.alert跟踪xmlHttp.readystate的变化,发现于原来它运行的机制是这样的。首先创建一个xmlHttpRequest的对象之后xmlHttp.readyState的值是0了,然后xmlHttp.onreadystatechange = handlestatechange没有运行。紧接着是open(),这个函数发生了之后xmlHttp.readyState的值是1了,那么就会有一个断点在Open()函数处断开,保留现场,紧接着又返回到xmlHttp.onreadystatechange = handlestatechange运行,然后再执行Send()函数,这个函数发生了之后xmlHttp.readyState的值是2了,接着又返回到xmlHttp.onreadystatechange = handlestatechange运行。以此类推。

浏览器因为不能真正地像面向对象那么编程,所以找了个折衷的办法,但是这个办法看起来不伦不类,想了半天,再跟一个同学一起讨论,才得出这样的一个结果。

关于onreadystatechange属性(转)相关推荐

  1. XmlHttp.onreadystatechange属性

    指定当readyState属性改变时的事件处理句柄 语法 oXMLHttpRequest.onreadystatechange = funcMyHandler; Example 如下的例子演示当XML ...

  2. Ajax之onreadystatechange属性详解

    发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态,XMLHttpRequest对象提供了onreadyStateChange事件实现这一功能.这类似于回调函数的 ...

  3. 对onreadystatechange属性的理解

    在编写Ajax方法的时候,我们经常会写上类似于这样的代码: <script type="text/javascript"> var xmlHttp; //创建一个Xml ...

  4. 对对onreadystatechange属性的理解

    http://blog.chinaunix.net/uid-20730110-id-1883890.html 在编写Ajax方法的时候,我们经常会写上类似于这样的代码: <script type ...

  5. 关于onreadystatechange属性的一点疑问

    在编写Ajax方法的时候,我们经常会写上类似于这样的代码: < script type = " text/javascript " > var  xmlHttp; // ...

  6. 对 onreadystatechange 属性的理解

    在编写 Ajax 方法的时候,我们经常会写上类似于这样的代码: Ajax 代码: var xmlHttp; //创建一个XmlHttpRequeset对象 function createXMLHttp ...

  7. ajax onreadystatechange属性

    当异步对象状态发生改变时触发

  8. XMLDOM对象方法:对象属性

    轉自:http://www.cnbruce.com/blog/showlog.asp?cat_id=34&log_id=1085 async 属性 作 用 async 属性表示是否允许异步的下 ...

  9. JS----Ajax中XMLHttpRequest常用方法及属性

    1. XMLHttpRequest常用方法 一.open(); XMLHttpRequest.open()方法用于指定 HTTP 请求的参数,或者说初始化 XMLHttpRequest 实例对象.它一 ...

最新文章

  1. 16 导出pcb各网络的布线长度_设计PCB流程
  2. ERP顾问的三层境界
  3. 问题解决:SqlParameterCollection只接受非空的SqlParameter类型对象,不接受SqlParameter[]对象
  4. C++ 不能在构造函数中调用构造函数
  5. 黑客攻破网站涂鸦特效(强烈建议看看)
  6. vs中imshow函数报错_opencv编程:8 imshow不显示图像和waitkey函数
  7. RestTemplate设置通用header
  8. linux环境 phpstudy集成环境中设置php永久环境变量
  9. Bullmind-在线UML软件工具箱
  10. 骚年快答 | 微服务架构中的BFF到底是啥?
  11. python爬虫之协程理解爬取照片的简单版
  12. (九)OpenCV Canny边缘检测
  13. 【python 目标检测】基于深度学习的道路破损检测|yolov5|VOC
  14. VUE+ECHARTS结合使用制作一个图标页面
  15. scala case 常用简写
  16. appuim框架二次封装-UI自动化-自整理亲自实践
  17. 通过iptables 禁止访问域名方法整合
  18. tdengine和mysql区别_TDEngine Game Framework
  19. 30岁运营设备10w+的工程师思考设备运营还能做什么?
  20. Docker的常用命令

热门文章

  1. 【BLOG】流光映雪
  2. Android组件的通讯-Intent
  3. 基于IPSec的×××配置实验
  4. hdu 4012(bfs+位压缩)
  5. hud-1495--非常可乐 VS nyoj-21--三个水杯
  6. MYSQL免安装版-安装配置过程
  7. shell kill
  8. hihocoder offer收割编程练习赛12 B 一面砖墙
  9. Delphi编程之系统OEM DIY
  10. 【Linux高级驱动】如何分析并移植网卡驱动