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 相关文章推荐
tagName的使用,留一笔
Jun 26 Javascript
用Jquery重写windows.alert方法实现思路
Apr 03 Javascript
关于js内存泄露的一个好例子
Dec 09 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
Dec 11 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
Jun 05 Javascript
JavaScript中Date对象的常用方法示例
Oct 24 Javascript
利用原生js和jQuery实现单选框的勾选和取消操作的方法
Sep 04 Javascript
详解用node-images 打造简易图片服务器
May 08 Javascript
jQuery实现点击DIV同时点击CheckBox,并为DIV上背景色的实例
Dec 18 jQuery
自定义vue组件发布到npm的方法
May 09 Javascript
js数组去重的N种方法(小结)
Jun 07 Javascript
发布一款npm包帮助理解npm的使用
Jan 03 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中实现汉字转区位码应用源码实例解析
2010/06/14 PHP
探讨PHP删除文件夹的三种方法
2013/06/09 PHP
PHP filter_var() 函数, 验证判断EMAIL,URL等
2021/03/09 PHP
用倒置滤镜把div倒置,再把table倒置。
2007/07/31 Javascript
js同时按下两个方向键
2007/12/01 Javascript
自己的js工具 Event封装
2009/08/21 Javascript
js网页侧边随页面滚动广告效果实现
2011/04/14 Javascript
Javascript this 的一些学习总结
2012/08/31 Javascript
创建js对象和js类的方法汇总
2014/12/24 Javascript
jQuery中:radio选择器用法实例
2015/01/03 Javascript
javascript 动态创建表格的2种方法总结
2015/03/04 Javascript
jQuery实现点击查看大图并以弹框的形式居中
2016/08/08 Javascript
Bootstrap基本样式学习笔记之标签(5)
2016/12/07 Javascript
简单实现Vue的observer和watcher
2016/12/21 Javascript
javascript九宫格图片随机打乱位置的实现方法
2017/03/15 Javascript
基于node.js之调试器详解
2017/08/22 Javascript
js实现扫雷小程序的示例代码
2017/09/27 Javascript
js设置鼠标悬停改变背景色实现详解
2019/06/26 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
2019/09/10 Javascript
原生JS实现拖拽效果
2020/12/04 Javascript
python局部赋值的规则
2013/03/07 Python
python3生成随机数实例
2014/10/20 Python
深入浅析python中的多进程、多线程、协程
2016/06/22 Python
Python urlencode和unquote函数使用实例解析
2020/03/31 Python
Python urllib2运行过程原理解析
2020/06/04 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
2020/11/17 Python
将HTML5 Canvas的内容保存为图片借助toDataURL实现
2013/05/20 HTML / CSS
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
德国帽子专家:Hutshopping
2019/11/03 全球购物
美国鲜花递送:UrbanStems
2021/01/04 全球购物
小学班长竞选演讲稿
2014/04/24 职场文书
青春无悔演讲稿
2014/05/08 职场文书
学习党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
2015年社区计生工作总结
2015/04/21 职场文书
2016小学优秀教师先进事迹材料
2016/02/26 职场文书
MySQL索引 高效获取数据的数据结构
2022/05/02 MySQL