[顶有分]关于XMLHTTP 4.0以下版本的onreadystatechange只触发一次的问题。
遇到一个问题在,xmlhttp 4.0以下才会出现的问题。xmlHttp.onreadystatechange只触发一次,之后再也不会出发了,这个问题如何解决?代码如下:
<script language="javascript">
var SERVER="Server.asp";
xmlHttp=new ActiveXObject("Msxml2.xmlHttp.3.0");
//xmlHttp=new ActiveXObject("Microsoft.XMLHttp");//这个版本也不行。
xmlHttp.onreadystatechange=onReady;
get();
function onReady() { //只有第一次触发时执行
if(xmlHttp.readyState==4) {
alert(xmlHttp.responseText)
}
}
function get() {
alert("get");//每次都有执行。
xmlHttp.Open("POST", SERVER, true);
xmlHttp.Send();
timer=setTimeout(get, 3000);
}
</script>
问题点数:80、回复次数:12Top
1 楼JK_10000(JK)回复于 2006-02-28 13:58:34 得分 4
方法1:在url后面加个随机数,例如csdn贴子的后面总有个"?temp=.9102289"
方法2:修改ie设置:工具--internet选项--常规--设置--每次访问时检查Top
2 楼meizz(梅花雪)回复于 2006-02-28 14:19:50 得分 4
JK 已经答到点子上了。我就不画蛇添足了。Top
3 楼astra1(Hyperion)回复于 2006-03-01 01:07:55 得分 0
修改ie设置听起来比较寒一点 - -
可以在每次取完后重新定义xmlHttp
function onReady() { //只有第一次触发时执行
if(xmlHttp.readyState==4) {
alert(xmlHttp.responseText)
xmlHttp=new ActiveXObject("Microsoft.XMLHttp");
xmlHttp.onreadystatechange=arguments.callee;//方法自身
}
}
Top
4 楼ph580(.Net,我喜欢!www.bjcan.com/hengxing)回复于 2006-03-01 08:48:41 得分 1
jfTop
5 楼xuzuning(唠叨)回复于 2006-03-01 08:54:33 得分 4
方法三:在Server.asp中输出禁用缓存的头Top
6 楼mingxuan3000(铭轩)回复于 2006-03-01 09:26:04 得分 1
markTop
7 楼astra1(Hyperion)回复于 2006-03-01 17:39:13 得分 0
试过在head中加禁用缓存还是一样的,xmlhttp4.0以下可能认为页面没变化就不触发事件了Top
8 楼wtogether(wtogether)回复于 2006-03-01 18:05:34 得分 10
可以n次获取的,用这个:
<script language="javascript">
var SERVER = "http://www.163.com";
var xmlHttp = null;
function onReady()
{
if(xmlHttp.readyState==4)
{
alert(xmlHttp.getAllResponseHeaders());
delete(xmlHttp);
}
}
function get()
{
xmlHttp = new ActiveXObject("Msxml2.xmlHttp.3.0");
xmlHttp.Open("GET", SERVER, true);
xmlHttp.onreadystatechange = onReady;
xmlHttp.Send();
timer = setTimeout(get, 3000);
}
get();
</script>
Top
9 楼wtogether(wtogether)回复于 2006-03-01 18:09:13 得分 0
原因就是全局入口设置错误了
xmlHttp=new ActiveXObject("Msxml2.xmlHttp.3.0");
//xmlHttp=new ActiveXObject("Microsoft.XMLHttp");//这个版本也不行。
xmlHttp.onreadystatechange=onReady;//就是这里,不应该设置为全局变量的,因为下一次xmlHttp.Open的时候,前一个xmlHttp.onreadystatechange就销毁了Top
10 楼astra1(Hyperion)回复于 2006-03-01 22:10:19 得分 56
根据以上所有人的意见测试过了,真正原因的确是每次请求后onreadystatechange销毁了
但和是不是全局变量没关系,因为xmlHttp.onreadystatechange=new Function("..")的话结果也是一样
楼主的代码可以加上这一句解决这个问题
function get() {
alert("get");//每次都有执行。
xmlHttp.Open("POST", SERVER, true);
xmlHttp.Send();
xmlHttp.onreadystatechange=onReady;//重新定义一次handle
timer=setTimeout(get, 3000);
}Top
11 楼cds27(http://blog.csdn.net/cds27/)回复于 2006-03-06 14:15:42 得分 0
非常感谢astra1(Hyperion) 兄弟给出了详细的答案。
同时也感谢几位老大和其他兄弟的关注。Top
12 楼cds27(http://blog.csdn.net/cds27/)回复于 2006-03-06 14:23:34 得分 0
wtogether(wtogether) 兄弟的答案也是正解。Top



