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 相关文章推荐
硬盘浏览程序,保存成网页格式便可使用
Dec 03 Javascript
JS关键字变色实现思路及代码
Feb 21 Javascript
让新消息在网页标题闪烁提示的jQuery代码
Nov 04 Javascript
原生js和jquery中有关透明度设置的相关问题
Jan 08 Javascript
jQuery操作select下拉框的text值和value值的方法
May 31 Javascript
javascript实现10个球随机运动、碰撞实例详解
Jul 08 Javascript
js+html5实现canvas绘制椭圆形图案的方法
May 21 Javascript
JS访问DOM节点方法详解
Nov 29 Javascript
微信小程序 引用其他js文件实现代码
Feb 22 Javascript
jquery获取img的src值实例介绍
Jan 16 jQuery
vue实现侧边栏导航效果
Oct 21 Javascript
比较node.js和Deno
Apr 27 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函数preg_match_all正则表达式的基本使用详细解析
2013/08/31 PHP
php中filter函数验证、过滤用户输入的数据
2014/01/13 PHP
php+mysql不用递归实现的无限级分类实例(非递归)
2014/07/08 PHP
thinkPHP自动验证、自动添加及表单错误问题分析
2016/10/17 PHP
thinkphp中的多表关联查询的实例详解
2017/10/12 PHP
window.location.hash 使用说明
2010/11/08 Javascript
$.format,jquery.format 使用说明
2011/07/13 Javascript
javascript的原生方法获取数组中的最大(最小)值
2012/12/19 Javascript
JavaScript弹出窗口方法汇总
2014/08/12 Javascript
js实现编辑div节点名称的方法
2014/12/17 Javascript
javascript函数自动执行常用方法汇总
2016/03/28 Javascript
深入浅析JavaScript中的constructor
2016/04/19 Javascript
Javascript随机标签云代码实例
2016/06/21 Javascript
JS获取input file绝对路径的方法(推荐)
2016/08/02 Javascript
教你一步步用jQyery实现轮播器
2016/12/18 Javascript
jQuery实现弹出窗口弹出div层的实例代码
2017/01/09 Javascript
浅析从vue源码看观察者模式
2018/01/29 Javascript
Vue 开发音乐播放器之歌手页右侧快速入口功能
2018/08/08 Javascript
javascript实现抢购倒计时程序
2019/08/26 Javascript
基于jQuery实现可编辑的表格
2019/12/11 jQuery
[01:22:28]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第一场 1月18日
2021/03/11 DOTA
在Python中使用HTML模版的教程
2015/04/29 Python
python统计文本文件内单词数量的方法
2015/05/30 Python
Python求两个文本文件以行为单位的交集、并集与差集的方法
2015/06/17 Python
Python实现简易端口扫描器代码实例
2017/03/15 Python
python实现画一颗树和一片森林
2018/06/25 Python
Python Sympy计算梯度、散度和旋度的实例
2019/12/06 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
2020/01/08 Python
CSS伪类与CSS伪元素的区别及由来具体说明
2012/12/07 HTML / CSS
Html5自定义字体解决方法
2019/10/09 HTML / CSS
植物选择:Botanic Choice
2017/02/15 全球购物
三只松鼠官方旗舰店:全网坚果销售第1
2017/11/25 全球购物
平安家庭事迹材料
2014/12/20 职场文书
基层党建工作简报
2015/07/21 职场文书
服装店员工管理制度
2015/08/07 职场文书
javascript的var与let,const之间的区别详解
2022/02/18 Javascript