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 相关文章推荐
jQuery Flash/MP3/Video多媒体插件
Jan 18 Javascript
jQuery dialog 异步调用ashx,webservice数据的代码
Aug 03 Javascript
js分页代码分享
Apr 28 Javascript
js实现图片放大和拖拽特效代码分享
Sep 05 Javascript
基于jQuery实现复选框是否选中进行答题提示
Dec 10 Javascript
javascript移动开发中touch触摸事件详解
Mar 18 Javascript
JavaScript利用fetch实现异步请求的方法实例
Jul 26 Javascript
10个最优秀的Node.js MVC框架
Aug 24 Javascript
阿里大于短信验证码node koa2的实现代码(最新)
Sep 07 Javascript
layer扩展打开/关闭动画的方法
Sep 23 Javascript
微信小程序canvas截取任意形状的实现代码
Jan 13 Javascript
JavaScript this关键字指向常用情况解析
Sep 02 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正则preg_replace_callback函数用法实例
2015/06/01 PHP
PHP实现的oracle分页函数实例
2016/01/25 PHP
PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
2018/12/21 PHP
PHP实现微信提现(企业付款到零钱)
2019/08/01 PHP
PHP中迭代器的简单实现及Yii框架中的迭代器实现方法示例
2020/04/26 PHP
Javascript 中 null、NaN和undefined的区别总结
2013/04/10 Javascript
jquery修改属性值实例代码(设置属性值)
2014/01/06 Javascript
JavaScript——DOM操作——Window.document对象详解
2016/07/14 Javascript
微信小程序-消息提示框实例
2016/11/24 Javascript
浅析JavaScript中的平稳退化(graceful degradation)
2017/07/24 Javascript
详解Node中导入模块require和import的区别
2017/08/11 Javascript
防止页面url缓存中ajax中post请求的处理方法
2017/10/10 Javascript
js插件实现图片滑动验证码
2020/09/29 Javascript
PWA介绍及快速上手搭建一个PWA应用的方法
2019/01/27 Javascript
微信小程序Echarts覆盖正常组件问题解决
2019/07/13 Javascript
vue通过数据过滤实现表格合并
2020/11/30 Javascript
vscode调试node.js的实现方法
2020/03/22 Javascript
简单文件操作python 修改文件指定行的方法
2013/05/15 Python
使用Python脚本来控制Windows Azure的简单教程
2015/04/16 Python
利用python批量检查网站的可用性
2016/09/09 Python
使用python实现kNN分类算法
2019/10/16 Python
在django admin详情表单显示中添加自定义控件的实现
2020/03/11 Python
详解Python GUI编程之PyQt5入门到实战
2020/12/10 Python
使用phonegap操作数据库的实现方法
2017/03/31 HTML / CSS
美国豪华时尚女性精品店:Kirna Zabête
2018/01/11 全球购物
测试时代收集的软件测试面试题
2013/09/25 面试题
大三在校生电子商务求职信
2013/10/29 职场文书
网络技术专业推荐信
2014/02/20 职场文书
运动会入场口号
2014/06/07 职场文书
婚内房产协议书范本
2014/10/02 职场文书
2014年保卫工作总结
2014/12/05 职场文书
中学生学习保证书
2015/02/26 职场文书
2015年复活节活动总结
2015/02/27 职场文书
老干部座谈会主持词
2015/07/03 职场文书
团队合作精神学习心得体会
2016/01/19 职场文书
SpringBoot接入钉钉自定义机器人预警通知
2022/07/15 Java/Android