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 归并方法
Jan 21 Javascript
jQuery实现鼠标划过展示大图的方法
Mar 09 Javascript
JavaScript更改原始对象valueOf的方法
Mar 19 Javascript
JS中多步骤多分步的StepJump组件实例详解
Apr 01 Javascript
探讨跨域请求资源的几种方式(总结)
Dec 02 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
Oct 27 Javascript
jQuery除指定区域外点击任何地方隐藏DIV功能
Nov 13 jQuery
微信小程序三级联动选择器使用方法
May 19 Javascript
深入理解移动前端开发之viewport
Oct 19 Javascript
Vue实现push数组并删除的例子
Nov 01 Javascript
详解vue 组件
Jun 11 Javascript
js实现星星打分效果
Jul 05 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更新mysql后获取影响的行数发生异常解决方法
2013/03/28 PHP
php获取网页中图片、DIV内容的简单方法
2014/06/19 PHP
PHP简单实现DES加密解密的方法
2016/07/12 PHP
thinkphp3.2实现跨控制器调用其他模块的方法
2017/03/14 PHP
js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码
2011/07/27 Javascript
jQuery遍历Form示例代码
2013/09/03 Javascript
js clearInterval()方法的定义和用法
2015/11/11 Javascript
JS获取鼠标相对位置的方法
2016/09/20 Javascript
JS简单实现移动端日历功能示例
2016/12/28 Javascript
Angular表格神器ui-grid应用详解
2017/09/29 Javascript
JS+Canvas绘制动态时钟效果
2017/11/10 Javascript
工作中常用到的ES6语法
2018/09/04 Javascript
vue2 设置router-view默认路径的实例
2018/09/20 Javascript
three.js实现炫酷的全景3D重力感应
2018/12/30 Javascript
JavaScript对JSON数组简单排序操作示例
2019/01/31 Javascript
关于vue状态过渡transition不起作用的原因解决
2019/04/09 Javascript
express + jwt + postMan验证实现持久化登录
2019/06/05 Javascript
vue 实现 rem 布局或vw 布局的方法
2019/11/13 Javascript
JS实现商品橱窗特效
2020/01/09 Javascript
[02:08:58]2014 DOTA2国际邀请赛中国区预选赛 Ne VS CIS
2014/05/22 DOTA
python通过加号运算符操作列表的方法
2015/07/28 Python
python学习之编写查询ip程序
2016/02/27 Python
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
django基础之数据库操作方法(详解)
2017/05/24 Python
python MysqlDb模块安装及其使用详解
2018/02/23 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
2020/12/07 Python
让IE支持CSS3的不完全兼容方案
2014/09/19 HTML / CSS
Avène雅漾美国官方网站:敏感肌肤护理专家
2016/10/24 全球购物
客户经理岗位职责
2013/12/08 职场文书
《秋姑娘的信》教学反思
2014/02/28 职场文书
纪检干部对照检查材料
2014/08/22 职场文书
节能环保家庭事迹材料
2014/08/27 职场文书
统计学教授推荐信
2014/09/18 职场文书
2014医学院领导班子对照检查材料思想汇报
2014/09/19 职场文书
基层工作经验证明样本
2014/11/16 职场文书
大学生奶茶店创业计划书
2019/06/25 职场文书