Ajax 聊天消息重复而不只是更新
Ajax chat messages repeating rather than just updating
现在正在做自己的聊天系统,东西(练习)。一切正常,只有一点点。当我输入一条新消息时,数据库中的所有消息都会再次添加,而不仅仅是更新现有日志。
例如日志:
9th-Apr dunkirk: come a bit closer 16:57
然后我会添加另一条消息说太远了!它会更新,但会重复这样的:
9th-Apr dunkirk: come a bit closer 16:57
9th-Apr dunkirk: come a bit closer 16:57 <--repeating everything again
9th-Apr dunkirk: TOO FAR! 16:58
有相当多的代码,所以我只包括有问题的部分(据我所知):
function updateMessages(){
if (xmlhttp.readyState==4) {
if (xmlhttp.status==200) {
try{
xmlText = xmlhttp.responseXML;
messages = xmlText.getElementsByTagName('messages');
for (var i = 0; i < messages.length; i++) {
time = '<td>'+messages[i].getElementsByTagName('time')[0].innerHTML+'</td>';
date = '<td>'+messages[i].getElementsByTagName('date')[0].innerHTML+'</td>';
username = '<td>'+messages[i].getElementsByTagName('username')[0].innerHTML+'</td>';
message = '<td>'+messages[i].getElementsByTagName('message')[0].innerHTML+'</td>';
text = date+username+message+time;
tr = document.createElement('tr');
tr.innerHTML = text;
document.getElementById('chatMessages').appendChild(tr);
};
}catch(e){
console.log(e);
}
}
};
}
我希望它显示所有消息,不重复,但在遇到新消息时仍会更新,就像大多数聊天一样。
我之前在注册系统中遇到过类似的问题,我用 while 循环修复了该问题,但该修复在本例中似乎不起作用。之前的修复是:
while (update.firstChild) {
update.removeChild(update.firstChild);
}
检查parent是否有child,如果没有继续,如果有,删除child。
我确信关于初始文本创建的解决方案非常简单,但你可能会说我对此很陌生。
我假设您在 html 代码中有 table 元素。
假设它的 id 是 chatTable.
在 for 循环之前添加以下内容
document.getElementById("chatTable").innerHTML = "";
我认为这应该可行。
您似乎总是将整个聊天记录附加到您的消息中,而不仅仅是那些新消息。因此,您需要记录您看到的消息,并且只插入尚未添加的新消息。
// at the start of your script
var chatLog = {};
// --- SNIP ---
for (var i = 0; i < messages.length; i++) {
time = '<td>' + messages[i].getElementsByTagName('time')[0].innerHTML + '</td>';
date = '<td>' + messages[i].getElementsByTagName('date')[0].innerHTML + '</td>';
username = '<td>' + messages[i].getElementsByTagName('username')[0].innerHTML + '</td>';
message = '<td>' + messages[i].getElementsByTagName('message')[0].innerHTML + '</td>';
text = date + username + message + time;
if (!chatLog[text]) {
continue; // don't add the message to the chat as it already exists
}
tr = document.createElement('tr');
tr.innerHTML = text;
document.getElementById('chatMessages').appendChild(tr);
chatLog[text] = true; // mark that we've already added this message
};
您也可以在添加消息之前始终清除 table,但这样可以避免不必要的 DOM 插入(以多一点内存为代价)。
现在正在做自己的聊天系统,东西(练习)。一切正常,只有一点点。当我输入一条新消息时,数据库中的所有消息都会再次添加,而不仅仅是更新现有日志。
例如日志:
9th-Apr dunkirk: come a bit closer 16:57
然后我会添加另一条消息说太远了!它会更新,但会重复这样的:
9th-Apr dunkirk: come a bit closer 16:57
9th-Apr dunkirk: come a bit closer 16:57 <--repeating everything again
9th-Apr dunkirk: TOO FAR! 16:58
有相当多的代码,所以我只包括有问题的部分(据我所知):
function updateMessages(){
if (xmlhttp.readyState==4) {
if (xmlhttp.status==200) {
try{
xmlText = xmlhttp.responseXML;
messages = xmlText.getElementsByTagName('messages');
for (var i = 0; i < messages.length; i++) {
time = '<td>'+messages[i].getElementsByTagName('time')[0].innerHTML+'</td>';
date = '<td>'+messages[i].getElementsByTagName('date')[0].innerHTML+'</td>';
username = '<td>'+messages[i].getElementsByTagName('username')[0].innerHTML+'</td>';
message = '<td>'+messages[i].getElementsByTagName('message')[0].innerHTML+'</td>';
text = date+username+message+time;
tr = document.createElement('tr');
tr.innerHTML = text;
document.getElementById('chatMessages').appendChild(tr);
};
}catch(e){
console.log(e);
}
}
};
}
我希望它显示所有消息,不重复,但在遇到新消息时仍会更新,就像大多数聊天一样。
我之前在注册系统中遇到过类似的问题,我用 while 循环修复了该问题,但该修复在本例中似乎不起作用。之前的修复是:
while (update.firstChild) {
update.removeChild(update.firstChild);
}
检查parent是否有child,如果没有继续,如果有,删除child。
我确信关于初始文本创建的解决方案非常简单,但你可能会说我对此很陌生。
我假设您在 html 代码中有 table 元素。 假设它的 id 是 chatTable.
在 for 循环之前添加以下内容
document.getElementById("chatTable").innerHTML = "";
我认为这应该可行。
您似乎总是将整个聊天记录附加到您的消息中,而不仅仅是那些新消息。因此,您需要记录您看到的消息,并且只插入尚未添加的新消息。
// at the start of your script
var chatLog = {};
// --- SNIP ---
for (var i = 0; i < messages.length; i++) {
time = '<td>' + messages[i].getElementsByTagName('time')[0].innerHTML + '</td>';
date = '<td>' + messages[i].getElementsByTagName('date')[0].innerHTML + '</td>';
username = '<td>' + messages[i].getElementsByTagName('username')[0].innerHTML + '</td>';
message = '<td>' + messages[i].getElementsByTagName('message')[0].innerHTML + '</td>';
text = date + username + message + time;
if (!chatLog[text]) {
continue; // don't add the message to the chat as it already exists
}
tr = document.createElement('tr');
tr.innerHTML = text;
document.getElementById('chatMessages').appendChild(tr);
chatLog[text] = true; // mark that we've already added this message
};
您也可以在添加消息之前始终清除 table,但这样可以避免不必要的 DOM 插入(以多一点内存为代价)。