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 相关文章推荐
查询绑定数据岛的表格中的文本并修改显示方式的js代码
Dec 15 Javascript
javaScript array(数组)使用字符串作为数组下标的方法
Nov 19 Javascript
JS和函数式语言的三特性
Mar 05 Javascript
node.js中的buffer.write方法使用说明
Dec 10 Javascript
jQuery在线选座位插件seat-charts特效代码分享
Aug 27 Javascript
微信小程序 devtool隐藏的秘密
Jan 21 Javascript
利用node.js本地搭建HTTP服务器
Apr 19 Javascript
详解Vue.use自定义自己的全局组件
Jun 14 Javascript
javascript 初学教程及五子棋小程序的简单实现
Jul 04 Javascript
JS错误处理与调试操作实例分析
Apr 13 Javascript
elementui更改el-dialog关闭按钮的图标d的示例代码
Aug 04 Javascript
关于angular 8.1使用过程中的一些记录
Nov 25 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
html中select语句读取mysql表中内容
2006/10/09 PHP
PHP中读取文件的几个方法总结(推荐)
2016/06/03 PHP
Yii控制器中操作视图js的方法
2016/07/04 PHP
php生成word并下载代码实例
2019/03/15 PHP
laravel Validator ajax返回错误信息的方法
2019/09/29 PHP
JavaScript 继承详解(四)
2009/07/13 Javascript
JavaScript Event学习第五章 高级事件注册模型
2010/02/07 Javascript
SWFObject 2.1以上版本语法介绍
2010/07/10 Javascript
一次失败的jQuery优化尝试小结
2011/02/06 Javascript
jquery $.trim()方法使用介绍
2014/05/21 Javascript
基于JS实现的倒计时程序实例
2015/07/24 Javascript
Vue 实现树形视图数据功能
2018/05/07 Javascript
微信小程序实现下拉刷新动画
2019/06/21 Javascript
js验证密码强度解析
2020/03/18 Javascript
使用Python的判断语句模拟三目运算
2015/04/24 Python
深入浅析Python传值与传址
2018/07/10 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
python浪漫表白源码
2019/04/05 Python
使用Python OpenCV为CNN增加图像样本的实现
2019/06/10 Python
Pandas之groupby( )用法笔记小结
2019/07/23 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
2020/02/28 Python
python在一个范围内取随机数的简单实例
2020/08/16 Python
Unineed中文官网:高端护肤美妆与时尚配饰,英国直邮
2020/07/23 全球购物
ORACLE十问
2015/04/20 面试题
行政助理岗位职责
2013/11/10 职场文书
《记承天寺夜游》教学反思
2014/02/16 职场文书
《台湾的蝴蝶谷》教学反思
2014/02/20 职场文书
第一批党的群众路线教育实践活动工作总结
2014/03/03 职场文书
信息技术课后反思
2014/04/27 职场文书
技术股份合作协议书
2014/10/05 职场文书
2014年秘书工作总结
2014/11/25 职场文书
毕业论文致谢范文
2015/05/14 职场文书
高温慰问简报
2015/07/21 职场文书
2016年过年放假安排通知
2015/08/18 职场文书
2015年度个人工作总结报告
2015/10/24 职场文书
Python基础之数据类型知识汇总
2021/05/18 Python