[顶有分]关于XMLHTTP 4.0以下版本的onreadystatechange只触发一次的问题。

cds27 2006-02-20 04:02:53
遇到一个问题在,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>
...全文
264 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cds27 2006-03-06
  • 打赏
  • 举报
回复
wtogether(wtogether) 兄弟的答案也是正解。
cds27 2006-03-06
  • 打赏
  • 举报
回复
非常感谢astra1(Hyperion) 兄弟给出了详细的答案。

同时也感谢几位老大和其他兄弟的关注。
astra1 2006-03-01
  • 打赏
  • 举报
回复
根据以上所有人的意见测试过了,真正原因的确是每次请求后onreadystatechange销毁了
但和是不是全局变量没关系,因为xmlHttp.onreadystatechange=new Function("..")的话结果也是一样

楼主的代码可以加上这一句解决这个问题

function get() {
alert("get");//每次都有执行。
xmlHttp.Open("POST", SERVER, true);
xmlHttp.Send();

xmlHttp.onreadystatechange=onReady;//重新定义一次handle

timer=setTimeout(get, 3000);
}
mingxuan3000 2006-03-01
  • 打赏
  • 举报
回复
mark
xuzuning 2006-03-01
  • 打赏
  • 举报
回复
方法三:在Server.asp中输出禁用缓存的头
  • 打赏
  • 举报
回复
jf
wtogether 2006-03-01
  • 打赏
  • 举报
回复
原因就是全局入口设置错误了
xmlHttp=new ActiveXObject("Msxml2.xmlHttp.3.0");
//xmlHttp=new ActiveXObject("Microsoft.XMLHttp");//这个版本也不行。
xmlHttp.onreadystatechange=onReady;//就是这里,不应该设置为全局变量的,因为下一次xmlHttp.Open的时候,前一个xmlHttp.onreadystatechange就销毁了
wtogether 2006-03-01
  • 打赏
  • 举报
回复
可以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>
astra1 2006-03-01
  • 打赏
  • 举报
回复
试过在head中加禁用缓存还是一样的,xmlhttp4.0以下可能认为页面没变化就不触发事件了
astra1 2006-03-01
  • 打赏
  • 举报
回复
修改ie设置听起来比较寒一点 - -
可以在每次取完后重新定义xmlHttp

function onReady() { //只有第一次触发时执行
if(xmlHttp.readyState==4) {
alert(xmlHttp.responseText)

xmlHttp=new ActiveXObject("Microsoft.XMLHttp");
xmlHttp.onreadystatechange=arguments.callee;//方法自身

}
}
meizz 2006-02-28
  • 打赏
  • 举报
回复
JK 已经答到点子上了。我就不画蛇添足了。
JK_10000 2006-02-28
  • 打赏
  • 举报
回复
方法1:在url后面加个随机数,例如csdn贴子的后面总有个"?temp=.9102289"
方法2:修改ie设置:工具--internet选项--常规--设置--每次访问时检查

87,908

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧