document.onreadystatechange事件的用法分析


Posted in Javascript onOctober 17, 2009

这两天,正在给部门的一个项目做优化,其中一项是将web应用中的所有alert用div方式实现,javascript的相关方法都写好了,方法名为showDialog,前台页面调用showDialog方法一点也没有问题,可是页面一旦提交,从后台输出脚本,调用showDialog方法,就会时不时的出现问题了,报一个无法打开Internet站点的错误,在脚本中下断点调试,依然找不到问题的根源,最后到网上一查,这个问题有可能是页面没有完全加载造成的,于是乎,修改后台输出脚本的代码,将其改为
document.onreadystatechange=function() { if(document.readyState == 'complete'){ showDialog('来自网页的消息','用户名或密码错误,请重新输入!','warning'); } };
问题解决,一切OK!

document.onreadystatechange = subSomething;//当页面加载状态改变的时候执行这个方法. 
function subSomething() 
{ 
if(document.readyState == "complete"){ //当页面加载状态为完全结束时进入 
//你要做的操作。 
} 
}

说明 :onreadystatechange 事件能辨识readyState 属性的改变。

关于onreadystatechange属性的一点疑问
在编写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运行。以此类推。

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

Javascript 相关文章推荐
父窗口获取弹出子窗口文本框的值
Jun 27 Javascript
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
Apr 27 Javascript
js 日期比较相关天数代码
Apr 02 Javascript
在Mac OS上安装使用Node.js的项目自动化构建工具Gulp
Jun 18 Javascript
JS实现隐藏同级元素后只显示JS文件内容的方法
Sep 04 Javascript
Vue-Router实现页面正在加载特效方法示例
Feb 12 Javascript
angularJs在多个控制器中共享服务数据的方法
Sep 30 Javascript
node.js实现微信开发之获取用户授权
Mar 18 Javascript
javascript移动端 电子书 翻页效果实现代码
Sep 07 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
Sep 10 Javascript
写给新手同学的vuex快速上手指北小结
Apr 14 Javascript
javascript中call,apply,bind的区别详解
Dec 11 Javascript
将jQuery应用于login页面的问题及解决
Oct 17 #Javascript
层序遍历在ExtJs的TreePanel中的应用
Oct 16 #Javascript
JavaScript 基于原型的对象(创建、调用)
Oct 16 #Javascript
JavaScript 定义function的三种方式小结
Oct 16 #Javascript
JavaScript 函数式编程的原理
Oct 16 #Javascript
实现JavaScript中继承的三种方式
Oct 16 #Javascript
显示js对象所有属性和方法的函数
Oct 16 #Javascript
You might like
php中var_export与var_dump的区别分析
2010/08/21 PHP
php结合表单实现一些简单功能的例子
2011/06/04 PHP
PHP正确解析UTF-8字符串技巧应用
2012/11/07 PHP
smarty 缓存控制前的页面静态化原理
2013/03/15 PHP
php计算函数执行时间的方法
2015/03/20 PHP
php中引用&amp;的用法分析【变量引用,函数引用,对象引用】
2016/12/12 PHP
几个高效,简洁的字符处理函数
2007/04/12 Javascript
Prototype 学习 工具函数学习($A方法)
2009/07/12 Javascript
js下写一个事件队列操作函数
2010/07/19 Javascript
javascript权威指南 学习笔记之null和undefined
2011/09/25 Javascript
JavaScript中的常见问题解决方法(乱码,IE缓存,代理)
2013/11/28 Javascript
js+css实现超简洁的二级下拉菜单效果代码
2015/09/07 Javascript
浅析Node.js实现HTTP文件下载
2016/08/05 Javascript
总结Javascript中的隐式类型转换
2016/08/24 Javascript
jquery实现的回旋滚动效果完整实例【附demo源码下载】
2016/09/20 Javascript
jQuery中get方法用法分析
2016/12/07 Javascript
详解Vue 非父子组件通信方法(非Vuex)
2017/05/24 Javascript
Vue封装一个简单轻量的上传文件组件的示例
2018/03/21 Javascript
JS+HTML实现的圆形可点击区域示例【3种方法】
2018/08/01 Javascript
js中的this的指向问题详解
2019/08/29 Javascript
angular组件间通讯的实现方法示例
2020/05/07 Javascript
python多重继承实例
2014/10/11 Python
Python列表和元组的定义与使用操作示例
2017/07/26 Python
sublime python3 输入换行不结束的方法
2018/04/19 Python
Python上下文管理器全实例详解
2019/11/12 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
详解H5本地储存Web Storage
2017/07/03 HTML / CSS
HTML5 canvas 基本语法
2009/08/26 HTML / CSS
英国家喻户晓的家居商店:The Range
2019/03/25 全球购物
编程用JAVA解析XML的方式
2013/07/07 面试题
完美实现CSS垂直居中的11种方法
2021/03/27 HTML / CSS
高分子材料个人求职信范文
2013/09/25 职场文书
大学生社会实践活动总结
2014/07/03 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
售后服务承诺函格式
2015/01/21 职场文书
毕业生的自我鉴定表范文
2019/05/16 职场文书