关于 "XMLHttpRequest 的 readyState" 几个您可能不知道的细节
关于 "XMLHttpRequest 的 readyState" 几个你可能不知道的细节.
请大家原谅这个俗气的标题吧
如果这些你已经知道了 就算我火星好了
反正我早已经加入"火星常驻JE办事处"了.
==============================
XMLHttpRequest.onreadystatechange 按照定义 是
当 XMLHttpRequest 的 readyState 发生变化时 触发.
[ 注: readyState 在 XMLHttpRequest.open时即改变,
也就是说 onreadystatechange 最好在 open之前设置. ]
在 opera safari chrome IE7 FF3 中是这样.
但是 在 IE6 和 FF2中 却并不总是如此.
==============================
在 opera safari chrome IE7 FF3 中,
只有当 readyState 状态发生变化时 才会触发 onreadystatechange .
这里的"变化" 是指 readyState 有了新值而且这个新值和之前的值不一样.
所以 最后我附上的测试代码 在 opera safari chrome IE7 FF3 中, 每种状态值只会alert一次.
但是 在IE6 和 FF2中 , readyState 只要被重新赋值 ,不管值和之前是否一样,都会触发 onreadystatechange 事件.
xhr.open 之后 readyState==1
xhr.send 之初 readyState==1
....
在上述两个时刻 IE6 和 FF2中 都会触发 onreadystatechange 事件,
而 opera safari chrome IE7 FF3 则只会在 open时触发一次 ,下次触发则已经是在 readyState !== 1 时.
关于此问题 网上也有人提及
http://blog.csdn.net/hulefei29/archive/2008/04/18/2305683.aspx
显然这个"判断的频率"的这个观点是不正确的.
浏览器是不会通过轮询来做检查的, 实现机制应该是在 类似setReadyState()方法里做的.
==============================
另外 在我测试的例子中 , FF2 会alert多次 readyState==3 ,而 IE6 只会alert 一次 readyState==3.
也就是说 在处理 XHR与服务端交互时IE6和FF2的策略 还有所不同.
不过 目前我尚未知晓 具体的不同在哪里.
欢迎有经验的朋友发表一下看法.
==============================
值得注意的是, 在FireFox 3 中XMLHttpRequest.send之后 (readyState==4)
XMLHttpRequest会自动重新初始化 也就是说 在FF3中 下列例子的alert顺序是
1 2 3 4 1
这个特性是目前其他浏览器不具备的.
==============================
还有一个小细节注意一下 :
xmlHttp.onreadystatechange=function(){
// alert(this)
// 注意 上面那句中的 this 不是 xmlHttp, 是window
}
===============================
正是因为 onreadystatechange 有诸多未统一的细节 和不确定性
所以 在ExtJS 中 根本就没有使用 onreadystatechange 来实现对 XMLHttpRequest的监听.
而是 自己通过 setTimeout 和 setInterval 来实现的 XMLHttpRequest状态跟踪.
我想 这也是一个无奈之举吧.
===============================
说了这么多 可能有点太学究了 太专研细节了
对于框架满天飞的今天 这种细节技术可能确实无关紧要.
大家就看个热闹好了 呵呵
==============================
我测试用的代码 很简陋 呵呵 见笑了
所以要制定标准,一出还出了两个。http://www.w3.org/TR/XMLHttpRequesthttp://www.w3.org/TR/XMLHttpRequest2
无语了
hax 写道
所以要制定标准,一出还出了两个。http://www.w3.org/TR/XMLHttpRequesthttp://www.w3.org/TR/XMLHttpRequest2
无语了
一步一步走是好的方法。
第一个标准用来得到一个最大公约数,也就是将事实标准扶正。
第二个标准用于在这个基础上的改进。
XMLHttpRequest其实是一个不怎么地的API,但是历史证明,推到重来是没可能的,所以只有这样啦。
兄弟,你说错啦“也就是说 onreadystatechange 最好在 open之前设置.” 这个在IE6下面如果这样的话,回调函数是设置不好的,设置之后不会被调用, onreadystatechange要在open之后设置。误人了...
确实 我秀逗了
我自己的代码都是 onread... 在open后面的
但是有个事情很奇怪 我这里也是IE6 根本不受这个影响哦
我的 onreadystatechange 写在open前面 也是可以的
IE6后来出了补丁吧
我说要在前面 主要是为了捕捉 open时的状态变化.
忽略了浏览器版本的问题.
zuoshu 写道
兄弟,你说错啦“也就是说 onreadystatechange 最好在 open之前设置.” 这个在IE6下面如果这样的话,回调函数是设置不好的,设置之后不会被调用, onreadystatechange要在open之后设置。误人了...
确实 我秀逗了
我自己的代码都是 onread... 在open后面的
但是有个事情很奇怪 我这里也是IE6 根本不受这个影响哦
我的 onreadystatechange 写在open前面 也是可以的
IE6后来出了补丁吧
我说要在前面 主要是为了捕捉 open时的状态变化.
忽略了浏览器版本的问题.
不好意思,是我弄错了,我用
用
请大家原谅这个俗气的标题吧
如果这些你已经知道了 就算我火星好了
反正我早已经加入"火星常驻JE办事处"了.
==============================
XMLHttpRequest.onreadystatechange 按照定义 是
当 XMLHttpRequest 的 readyState 发生变化时 触发.
[ 注: readyState 在 XMLHttpRequest.open时即改变,
也就是说 onreadystatechange 最好在 open之前设置. ]
在 opera safari chrome IE7 FF3 中是这样.
但是 在 IE6 和 FF2中 却并不总是如此.
==============================
在 opera safari chrome IE7 FF3 中,
只有当 readyState 状态发生变化时 才会触发 onreadystatechange .
这里的"变化" 是指 readyState 有了新值而且这个新值和之前的值不一样.
所以 最后我附上的测试代码 在 opera safari chrome IE7 FF3 中, 每种状态值只会alert一次.
但是 在IE6 和 FF2中 , readyState 只要被重新赋值 ,不管值和之前是否一样,都会触发 onreadystatechange 事件.
xhr.open 之后 readyState==1
xhr.send 之初 readyState==1
....
在上述两个时刻 IE6 和 FF2中 都会触发 onreadystatechange 事件,
而 opera safari chrome IE7 FF3 则只会在 open时触发一次 ,下次触发则已经是在 readyState !== 1 时.
关于此问题 网上也有人提及
http://blog.csdn.net/hulefei29/archive/2008/04/18/2305683.aspx
引用
XMLHttpRequest.readyState这个值在IE7和Firefox中都是0,1,2,3,4,
但是经测试,IE各个数都只返回一次,而在firfox中3的值返回多次,
由此可以判断,firfox对readyState值改变的判断的频率高于IE7;...
但是经测试,IE各个数都只返回一次,而在firfox中3的值返回多次,
由此可以判断,firfox对readyState值改变的判断的频率高于IE7;...
显然这个"判断的频率"的这个观点是不正确的.
浏览器是不会通过轮询来做检查的, 实现机制应该是在 类似setReadyState()方法里做的.
==============================
另外 在我测试的例子中 , FF2 会alert多次 readyState==3 ,而 IE6 只会alert 一次 readyState==3.
也就是说 在处理 XHR与服务端交互时IE6和FF2的策略 还有所不同.
不过 目前我尚未知晓 具体的不同在哪里.
欢迎有经验的朋友发表一下看法.
==============================
值得注意的是, 在FireFox 3 中XMLHttpRequest.send之后 (readyState==4)
XMLHttpRequest会自动重新初始化 也就是说 在FF3中 下列例子的alert顺序是
1 2 3 4 1
这个特性是目前其他浏览器不具备的.
==============================
还有一个小细节注意一下 :
xmlHttp.onreadystatechange=function(){
// alert(this)
// 注意 上面那句中的 this 不是 xmlHttp, 是window
}
===============================
正是因为 onreadystatechange 有诸多未统一的细节 和不确定性
所以 在ExtJS 中 根本就没有使用 onreadystatechange 来实现对 XMLHttpRequest的监听.
而是 自己通过 setTimeout 和 setInterval 来实现的 XMLHttpRequest状态跟踪.
我想 这也是一个无奈之举吧.
===============================
说了这么多 可能有点太学究了 太专研细节了
对于框架满天飞的今天 这种细节技术可能确实无关紧要.
大家就看个热闹好了 呵呵
==============================
我测试用的代码 很简陋 呵呵 见笑了
// 页面文件就是 testAjax.html , 所以我请求的是自己 . function createXMLHttp(){ if (window.XMLHttpRequest) { return(new XMLHttpRequest()); } var arr_t = [ 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP' ] for(var i=0; i<arr_t.length; i++) { try { xmlhttp_ver = arr_t[i]; return new ActiveXObject(arr_t[i]); }catch(e) {} } return null ; } var xmlHttp = createXMLHttp(); xmlHttp.onreadystatechange = function(){ alert(xmlHttp.readyState); }; xmlHttp.open('post','testAjax.html',true); xmlHttp.send()
1 楼
天下有鹏
2008-11-04
支持!
2 楼
javaDevil
2008-11-04
早就知道了,IBM中国开发上一篇文章,是关于这方面的。
3 楼
juzhibest
2008-11-05
楼主的阿里妈妈广告 呵呵怎么放这里了.
呵呵. .支持你的阿里妈妈
呵呵. .支持你的阿里妈妈
4 楼
taya
2008-11-05
第一次知道这些细节,谢谢小胖
5 楼
hax
2008-11-06
所以要制定标准,一出还出了两个。
http://www.w3.org/TR/XMLHttpRequest
http://www.w3.org/TR/XMLHttpRequest2
http://www.w3.org/TR/XMLHttpRequest
http://www.w3.org/TR/XMLHttpRequest2
6 楼
fins
2008-11-06
hax 写道
所以要制定标准,一出还出了两个。http://www.w3.org/TR/XMLHttpRequesthttp://www.w3.org/TR/XMLHttpRequest2
无语了
7 楼
hax
2008-11-07
fins 写道
hax 写道
所以要制定标准,一出还出了两个。http://www.w3.org/TR/XMLHttpRequesthttp://www.w3.org/TR/XMLHttpRequest2
无语了
一步一步走是好的方法。
第一个标准用来得到一个最大公约数,也就是将事实标准扶正。
第二个标准用于在这个基础上的改进。
XMLHttpRequest其实是一个不怎么地的API,但是历史证明,推到重来是没可能的,所以只有这样啦。
8 楼
llp20_2000
2008-11-24
mark,mark
9 楼
zuoshu
2008-12-01
兄弟,你说错啦“也就是说 onreadystatechange 最好在 open之前设置.”
这个在IE6下面如果这样的话,回调函数是设置不好的,设置之后不会被调用, onreadystatechange要在open之后设置。误人了...
这个在IE6下面如果这样的话,回调函数是设置不好的,设置之后不会被调用, onreadystatechange要在open之后设置。误人了...
10 楼
fins
2008-12-01
zuoshu 写道
兄弟,你说错啦“也就是说 onreadystatechange 最好在 open之前设置.” 这个在IE6下面如果这样的话,回调函数是设置不好的,设置之后不会被调用, onreadystatechange要在open之后设置。误人了...
确实 我秀逗了
我自己的代码都是 onread... 在open后面的
但是有个事情很奇怪 我这里也是IE6 根本不受这个影响哦
我的 onreadystatechange 写在open前面 也是可以的
IE6后来出了补丁吧
我说要在前面 主要是为了捕捉 open时的状态变化.
忽略了浏览器版本的问题.
11 楼
zuoshu
2008-12-02
fins 写道
zuoshu 写道
兄弟,你说错啦“也就是说 onreadystatechange 最好在 open之前设置.” 这个在IE6下面如果这样的话,回调函数是设置不好的,设置之后不会被调用, onreadystatechange要在open之后设置。误人了...
确实 我秀逗了
我自己的代码都是 onread... 在open后面的
但是有个事情很奇怪 我这里也是IE6 根本不受这个影响哦
我的 onreadystatechange 写在open前面 也是可以的
IE6后来出了补丁吧
我说要在前面 主要是为了捕捉 open时的状态变化.
忽略了浏览器版本的问题.
不好意思,是我弄错了,我用
function getHTTPObject() { var xmlhttp=false; try {xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");} catch (e) { try{xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");} catch (e) {xmlhttp = false;} }if (!xmlhttp && typeof XMLHttpRequest!='undefined') {xmlhttp = new XMLHttpRequest(); if (xmlhttp.overrideMimeType) {xmlhttp.overrideMimeType('text/xml');} } return xmlhttp; }来得到XMLHTTPObject,再这样做是不行的
用
function getHTTPObject(){ if (window.XMLHttpRequest) { return(new XMLHttpRequest()); } var arr_t = [ "MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP" ]; for(var i=0; i<arr_t.length; i++) { try { xmlhttp_ver = arr_t[i]; return new ActiveXObject(arr_t[i]); }catch(e) {} } return null ; }得到XMLHTTPObject再这样设置是可以的。问问是XMLHTTPObject的版本问题吧?~
12 楼
fins
2008-12-02
谢谢你的回复
这个问题 我现在也越来越迷糊了
呵呵 等我再研究研究
不过 你说的那个原因是很有可能的哦.
这个问题 我现在也越来越迷糊了
呵呵 等我再研究研究
不过 你说的那个原因是很有可能的哦.