好吧,我正在尝试制作一个每隔400毫秒轮询聊天数据库的AJAX聊天系统。该部分正在运行,其中一部分不是活动用户列表。当我尝试组合这两个请求时,发出前两个请求,然后整个事情滚雪球,通常定时(12秒)活动用户列表请求每1ms开始更新,第一个请求永远不会再次发生。显示的是两个请求的完整AJAX代码:
var waittime=400;chatmsg=document.getElementById("chatmsg");
room = document.getElementById("roomid").value;
chatmsg.focus()
document.getElementById("chatwindow").innerHTML = "loading...";
document.getElementById("userwindow").innerHTML = "Loading User List...";
var xmlhttp = false;
var xmlhttp2 = false;
var xmlhttp3 = false;
function ajax_read(url) {
if(window.XMLHttpRequest){
xmlhttp=new XMLHttpRequest();
if(xmlhttp.overrideMimeType){
xmlhttp.overrideMimeType('text/xml');
}
} else if(window.ActiveXObject){
try{
xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
try{
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
} catch(e){
}
}
}
if(!xmlhttp) {
alert('Giving up :( Cannot create an XMLHTTP instance');
return false;
}
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState==4) {
document.getElementById("chatwindow").innerHTML = xmlhttp.responseText;
setTimeout("ajax_read('methods.php?method=r&room=" + room +"')", waittime);
}
}
xmlhttp.open('GET',url,true);
xmlhttp.send(null);
}
function user_read(url) {
if(window.XMLHttpRequest){
xmlhttp3=new XMLHttpRequest();
if(xmlhttp3.overrideMimeType){
xmlhttp3.overrideMimeType('text/xml');
}
} else if(window.ActiveXObject){
try{
xmlhttp3=new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
try{
xmlhttp3=new ActiveXObject("Microsoft.XMLHTTP");
} catch(e){
}
}
}
if(!xmlhttp3) {
alert('Giving up :( Cannot create an XMLHTTP instance');
return false;
}
xmlhttp3.onreadystatechange = function() {
if (xmlhttp3.readyState==4) {
document.getElementById("userwindow").innerHTML = xmlhttp3.responseText;
setTimeout("ajax_read('methods.php?method=u&room=" + room +"')", 12000);
}
}
xmlhttp3.open('GET',url,true);
xmlhttp3.send(null);
}
function ajax_write(url){
if(window.XMLHttpRequest){
xmlhttp2=new XMLHttpRequest();
if(xmlhttp2.overrideMimeType){
xmlhttp2.overrideMimeType('text/xml');
}
} else if(window.ActiveXObject){
try{
xmlhttp2=new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
try{
xmlhttp2=new ActiveXObject("Microsoft.XMLHTTP");
} catch(e){
}
}
}
if(!xmlhttp2) {
alert('Giving up :( Cannot create an XMLHTTP instance');
return false;
}
xmlhttp2.open('GET',url,true);
xmlhttp2.send(null);
}
function submit_msg(){
nick = document.getElementById("chatnick").value;
msg = document.getElementById("chatmsg").value;
document.getElementById("chatmsg").value = "";
ajax_write("methods.php?method=w&m=" + msg + "&n=" + nick + "&room=" + room + "");
}
function keyup(arg1) {
if (arg1 == 13) submit_msg();
}
var intUpdate = setTimeout("ajax_read('methods.php')", waittime);
var intUpdate = setTimeout("user_read('methods.php')", waittime);
答案 0 :(得分:2)
问题是在user_read
中设置了一个定时器,在12秒后运行ajax_read
,并使用正确的URL。因此,当调用此ajax_read
时,它会获取信息并设置新的超时,这次ajax_read
之后使用waittime
调用?method=r…
。因此,在user_read
的第一次超时后,它永远不会被再次调用。
仅供参考,我在本地网络服务器上使用Firebug(虚拟面板)以及虚假表单和methods.php进行了观看。在将waittime
设置为4000并使用.innerHTML += …
后,每隔4秒就会发生两次调用,这一点很明显。
index.html
(我知道,这很快):
<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
<title>Chat</title>
</head>
<body>
<input id="chatnick" type="text" value="Nickname"><br>
<input id="roomid" type="text" value="4"><br>
<input id="chatmsg" type="text"><br>
<div id="userwindow" style="width: 500px; height: 300px"></div><br>
<div id="chatwindow" style="width: 300px; height: 300px"></div><br>
<script src="js.js"></script>
</body>
</html>
虚假methods.php
:
blah<br>
另请注意xmlhttp.status
可能不是200
的可能性。