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

<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运行。以此类推。

Status存储了服务器端返回的Http请求响应代码,它表示请求的处理结果,常见响应代码的含义如右

200 请求成功

202 请求被接受但处理未完成

       400 错误请求404 请求资源未找到500 内部服务器错误

在Ajax开发中,最常用就是200这个响应码,代码如下: function changeTabCallBack(){ if(ajaxObj.readyState==4){ if(ajaxObj.status==200){ // 服务端返回了正确数据,开始响应处理 } } }

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

onreadystatechange -----设置为指向handlestatechange的函数的指针(比较难理解些)

函数是具有执行特定功能的子程序,编译后,它的执行代码分配在代码段,而其参数及变量则在堆栈段,因而主程序调用函数时,实际上就是将程序执行地址转移为函数在代码段的入口地址去执行,即每个函数都有一个在代码段的确定入口地址,依此程序执行,当遇到返回指令时(表示该程序结束),程序便返回到该函数调用者的断点程序处,又继续执行,既然函数有确定的入口地址(实际上函数名就代表了它的入口地址),因而可以用指针指向它,这个指针又称为函数指针

对onreadystatechange的理解相关推荐

  1. 对ajax源码的onreadystatechange的理解

    目录 源码 问题 修改验证 结论 源码 首先我们来看这么一段源码.... function showHint(str){if (str.length===0){document.getElementB ...

  2. ajax的readyState状态值和onreadystatechange事件,帮助你更好的理解ajax

    认识ajax的readyState状态值和onreadystatechange事件 1.readyState是什么? 2.readyState它有多少个值,分别代表什么? 3.认识ajax的onrea ...

  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理解

    onreadystatechange理解 查看全文 http://www.taodudu.cc/news/show-3604759.html 相关文章: Ajax onreadystatechange ...

  6. 对ajax中onreadystatechange事件执行流程的理解

    对Ajax中onreadystatechange事件执行流程的理解 onreadystatechange 事件 当请求被发送到服务器时,我们需要执行一些基于响应的任务. 每当 readyState 改 ...

  7. 对 onreadystatechange 属性的理解

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

  8. 深入理解JavaScript定时机制

    容易欺骗别人感情的JavaScript定时器 本文地址: http://www.laruence.com/2009/09/23/1089.html 转载文章 JavaScript的setTimeout ...

  9. 理解javascript 回调函数

    理解javascript 回调函数 原文:理解javascript 回调函数 ##回调函数定义 百度百科:回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一 ...

最新文章

  1. 【Android 安装包优化】Tint 着色器 ( 简介 | 布局文件中的 Tint 着色器基本用法 | 代码中使用 Tint 着色器添加颜色效果 )
  2. laravel 队列queue
  3. 物流设计大赛优秀作品_独家!亲历全国大学生物流设计大赛,队员、老师、专家这样说...
  4. (七)Docker网络配置
  5. idea 找不到或无法加载主类_解决IDEA中Groovy项目no Groovy library is defined的问题
  6. opencv (一) 学习通过OpenCV图形界面及基础
  7. linux安装网卡驱动tgz,Linux安装网卡驱动
  8. 【CSS】text-align:justify 的使用
  9. spring boot ---- jpa连接和操作mysql数据库
  10. 如何从视频中删除声音?
  11. Yarn resourceManager 无法启动
  12. 第3讲 zend原理剖析
  13. 会翻页GridView-1
  14. 用于机器学习的数据库--UCI数据库
  15. 盲盒小程序源码下载、附赠完整图片素材源码
  16. 微信公众号互助、开白群,小白报团取暖
  17. python 匹配字符串中所有单词并返回下标,python返回字符下标
  18. 达人评测 i9 13900H和i7 13700h差距 i913900H和i713700h选哪个
  19. 易經大意 061_080
  20. 微信无法连接到服务器的原因

热门文章

  1. 不能定义声明dllimport_DllImport与VB.NET中的声明
  2. macOS - pip install scipy Error: No BLAS/LAPACK libraries found
  3. 05 ,效果评估 : 估值函数
  4. linux下安装redis 可视化工具,类似于 Redis Desktop Manager
  5. 架构分层—高并发场景微服务实战(四)
  6. 丘成桐全职加入清华,清华已聚齐诺贝尔奖、图灵奖、菲尔兹奖三个“首位华人得主”...
  7. PB9.0连接MSSQL2005和MSSQL2008数据库出错!unable to load the requested database interface.
  8. 区块链追溯系统迎来新突破
  9. commonjs转换原生HTML,CommonJS
  10. python查找excel(xls,xlsx)