对onreadystatechange属性的理解&n…
2013-08-09 17:38
316 查看
在编写Ajax方法的时候,我们经常会写上类似于这样的代码:
(转)" />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)
(转)" /> }
(转)" /> }
(转)" />}
第一次阅读这段代码的时候,我就感到了一点点不对劲,但是说不出来什么地方不对劲。随着对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运行。以此类推。
浏览器因为不能真正地像面向对象那么编程,所以找了个折衷的办法,但是这个办法看起来不伦不类。
(转)" />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)
(转)" /> }
(转)" /> }
(转)" />}
第一次阅读这段代码的时候,我就感到了一点点不对劲,但是说不出来什么地方不对劲。随着对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运行。以此类推。
浏览器因为不能真正地像面向对象那么编程,所以找了个折衷的办法,但是这个办法看起来不伦不类。
相关文章推荐
- 对onreadystatechange属性的理解
- 对onreadystatechange属性的理解
- 对onreadystatechange属性的理解
- 对onreadystatechange属性的理解
- 对onreadystatechange属性的理解
- 对onreadystatechange属性的理解
- 对onreadystatechange属性的理解
- 对onreadystatechange属性的理解
- 对对onreadystatechange属性的理解
- window.onload,<body onload="function()">, document.onreadystatechange, httpRequest.onreadystatechang
- 对onreadystatechange的理解
- 关于onreadystatechange属性的一点疑问
- html--onreadystatechange属性
- <script>标签的onload和onreadystatechange事件以及defer属性
- requireJS&seaJS模块加载器原理:<script>标签加载外部js文件用到的onload、onerror和onreadystatechange事件
- 关于onreadystatechange属性(转)
- window.onload,&lt;body onload=&quot;function()&quot;&gt;, document.onreadystatechange, httpRequest.onreadystatechang
- document.onreadystatechange |||| document.readyState == \"complete\"
- 关于onreadystatechange属性的一点疑问
- AJAX - onreadystatechange 事件