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 相关文章推荐
JavaScript使用prototype定义对象类型(转)[
Dec 22 Javascript
jQuery 常见操作实现方式和常用函数方法总结
May 06 Javascript
js动态添加事件并可传参数示例代码
Oct 21 Javascript
jquery实现鼠标滑过后动态图片提示效果实例
Aug 10 Javascript
浅析js的模块化编写 require.js
Dec 07 Javascript
javascript简单链式调用案例分析
May 10 Javascript
微信小程序之网络请求简单封装实例详解
Jun 28 Javascript
BootStrap TreeView使用实例详解
Nov 01 Javascript
vue2 全局变量的设置方法
Mar 09 Javascript
vue2.0 资源文件assets和static的区别详解
Apr 08 Javascript
vue实现移动端图片上传功能
Dec 23 Javascript
ES2020 已定稿,真实场景案例分析
May 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
新安装的MySQL数据库需要注意的安全知识
2008/07/30 PHP
Discuz 模板语句分析及知识技巧
2009/08/21 PHP
GBK的页面输出JSON格式的php函数
2010/02/16 PHP
php阻止页面后退的方法分享
2014/02/17 PHP
php中的buffer缓冲区用法分析
2019/05/31 PHP
js控制iframe的高度/宽度让其自适应内容
2014/04/09 Javascript
JS判断、校验MAC地址的2个实例
2014/05/05 Javascript
javascript折半查找详解
2015/01/26 Javascript
JavaScript计时器示例分析
2015/02/05 Javascript
Bootstrap 下拉多选框插件Bootstrap Multiselect
2017/01/22 Javascript
jquery实现表单获取短信验证码代码
2017/03/13 Javascript
AngularJS实现的回到顶部指令功能实例
2017/05/17 Javascript
Nodejs中的require函数的具体使用方法
2019/04/02 NodeJs
layui按条件隐藏表格列的实例
2019/09/19 Javascript
纯js+css实现仿移动端淘宝网站的弹出详情框功能
2019/12/29 Javascript
使用PreloadJS加载图片资源的基础方法详解
2020/02/03 Javascript
javascript利用canvas实现鼠标拖拽功能
2020/07/23 Javascript
Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
2015/03/19 Python
python format 格式化输出方法
2018/07/16 Python
对python多线程中Lock()与RLock()锁详解
2019/01/11 Python
浅谈pyqt5在QMainWindow中布局的问题
2019/06/21 Python
Python批量查询关键词微信指数实例方法
2019/06/27 Python
python程序 线程队列queue使用方法解析
2019/09/23 Python
python利用dlib获取人脸的68个landmark
2019/11/27 Python
在keras里面实现计算f1-score的代码
2020/06/15 Python
python获得命令行输入的参数的两种方式
2020/11/02 Python
Darphin迪梵官网: 来自巴黎,植物和精油调制的护肤品牌
2016/10/11 全球购物
潘多拉意大利官方网上商城:网上选购PANDORA珠宝
2018/10/07 全球购物
Kipling意大利官网:世界著名的时尚休闲包袋品牌
2019/06/05 全球购物
《三峡》教学反思
2014/03/01 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
服务理念口号
2014/06/11 职场文书
2014年行政执法工作总结
2014/12/11 职场文书
毕业生就业推荐表自我评价
2015/03/02 职场文书
十二生肖观后感
2015/06/12 职场文书
vue ref如何获取子组件属性值
2022/03/31 Vue.js