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 $(document).ready() 与window.onload的区别
Dec 28 Javascript
ExtJS 下拉多选框lovcombo
May 19 Javascript
基于jquery的Repeater实现代码
Jul 17 Javascript
关闭ie窗口清除Session的解决方法
Jan 10 Javascript
jQuery显示和隐藏 常用的状态判断方法
Jan 29 Javascript
跟我学习javascript的垃圾回收机制与内存管理
Nov 23 Javascript
JS查找字符串中出现最多的字符及个数统计
Feb 04 Javascript
谈谈VUE种methods watch和compute的区别和联系
Aug 01 Javascript
vue项目tween方法实现返回顶部的示例代码
Mar 02 Javascript
jQuery基于随机数解决中午吃什么去哪吃问题示例
Dec 29 jQuery
JavaScript使用闭包模仿块级作用域操作示例
Jan 21 Javascript
js实现点击烟花特效
Oct 14 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
星际争霸中的对战模式介绍
2020/03/04 星际争霸
php读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法
2013/08/10 PHP
ThinkPHP实现带验证码的文件上传功能实例
2014/11/01 PHP
php创建多级目录的方法
2015/03/24 PHP
带你了解PHP7 性能翻倍的关键
2015/11/19 PHP
JavaScript 笔记二 Array和Date对象方法
2010/05/22 Javascript
基于jquery的lazy loader插件实现图片的延迟加载[简单使用]
2011/05/07 Javascript
让人印象深刻的10个jQuery手风琴效果应用
2012/05/08 Javascript
jquery插件开发注意事项小结
2013/06/04 Javascript
通过遮罩层实现浮层DIV登录的js代码
2014/02/07 Javascript
JS判断、校验MAC地址的2个实例
2014/05/05 Javascript
使用jquery.upload.js实现异步上传示例代码
2014/07/29 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
2014/09/22 Javascript
JavaScript中的console.group()函数详细介绍
2014/12/29 Javascript
js+css实现导航效果实例
2015/02/10 Javascript
JavaScript实现图片轮播的方法
2015/07/31 Javascript
js实现瀑布流的三种方式比较
2020/06/28 Javascript
JS中闭包的经典用法小结(2则示例)
2016/12/28 Javascript
package.json文件配置详解
2017/06/15 Javascript
关于vue中的ajax请求和axios包问题
2018/04/19 Javascript
微信小程序 image组件遇到的问题
2019/05/28 Javascript
使用Vue-cli 中为单独页面设置背景图片铺满全屏
2020/07/17 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
2020/09/04 Javascript
Python三种遍历文件目录的方法实例代码
2018/01/19 Python
python爬取指定微信公众号文章
2018/12/20 Python
10招!看骨灰级Pythoner玩转Python的方法
2019/04/15 Python
用CSS3来实现社交分享按钮
2014/11/11 HTML / CSS
HTML5获取当前地理位置并在百度地图上展示的实例
2020/07/10 HTML / CSS
Sunglasses Shop德国站:欧洲排名第一的太阳镜网站
2017/08/01 全球购物
电子狗项圈:eDog Australia
2019/12/04 全球购物
研究生求职推荐信范文
2013/11/30 职场文书
机电专业个人求职信范文
2013/12/30 职场文书
暑期社会实践个人总结
2015/03/06 职场文书
写作技巧:优秀文案必备的3种结构
2019/08/19 职场文书
送给自己的励志语句:要安静的优秀,悄无声息的坚强
2019/11/26 职场文书
如何理解python接口自动化之logging日志模块
2021/06/15 Python