我的ajaxPoll聊天系统出现问题。我正在尝试将聊天消息的div
的最后一个Id发送回php
,因此查询只能显示高于上次发送的Id的结果。
所有聊天消息都在一个名为chat_log
的div
中。消息周围会有一个div
,带有消息id的类。它会有文本message
,然后是该消息的id,例如:class="message543"
。好的,为了更容易理解,这里有一个HTML的示例,具有正确的结构和顺序。
<div id='chat_log'>
<div class='message435'></div>
<div class='message436'></div>
<div class='message437'></div>
<div class='message438'></div>
<div class='message439'></div>
<div class='message440'></div>
<div class='message441'></div>
</div>
正如你所看到的,div max中有7条消息。任何高于这个值的消息都会被删除(如果一切正常,只需一点额外信息。)另一件需要注意的事情是,我使用了jquery库和jquery插件,这要归功于这篇博客文章。(关于插件功能的信息可以在那里找到。)
我尝试过的:
function ajaxGo() {
$.ajaxPollSettings.pollingType = "interval";
$.ajaxPollSettings.interval = 700;
$.ajaxPollSettings.maxInterval = 1000;
$.ajaxPollSettings.durationUntilMaxInterval = 2000;
var httpcount = 1;
var lastDiv = lastDiv = $('#chat_log').find('div:last-child');
var lastId = lastDiv[0].className.substring(7);
$.ajaxPoll({
url: "place_chat/update.php",
type: "POST",
data: {
where: where,
'last': lastId
},
dataType: "html",
cache: false,
successCondition: function (result) {
var responseString = result;
if (result != '') {
$(result).appendTo('#chat_log').show();
lastDiv = lastDiv = $('#chat_log').find('div:last-child');
lastId = lastDiv[0].className.substring(7);
console.log(lastId);
httpcount = httpcount + 1;
if (!hasFocus && !titleCurrentlyChanging) {
changeTitle();
}
soundHandle = document.getElementById('soundHandle');
soundHandle.src = '../Sounds/Message.wav';
soundHandle.play();
}
}
});
}
$(document).ready(function () {
$('#chat_log').append('<div class="message0">Test</div>');
setTimeout(ajaxGo, 500);
});
代码去掉字符串"message",然后获取数字。代码:
lastDiv = lastDiv = $('#chat_log').find('div:last-child');
lastId = lastDiv[0].className.substring(7);
console.log(lastId);
粘贴到控制台时工作正常,并输出正确的最后一条div
的消息id
。
然而,当它非手动运行时(可能是因为它不在函数或循环中或其他什么),由于某种原因,当有其他消息与1000
+的id
有关时,代码只发送"0
"。我还尝试了许多其他方法,比如setInterval
的等等。我认为可能导致问题的一件事是变量范围,就好像当调用轮询的成功function
时,它不会调整lastId
变量。不过,我不完全确定情况是否如此。如果是这样的话,我将非常感谢关于如何修复变量范围以使代码正确工作的支持。
顺便说一句,php工作成功,所以我不需要任何帮助
重要编辑(使问题更容易理解):代码
lastDiv = lastDiv = $('#chat_log').find('div:last-child');
lastId = lastDiv[0].className.substring(7);
工作良好,它的周围区域(结构)似乎是问题所在。此外,where
与此where
无关,只是"告诉"php脚本从何处发送。我知道第一个附加了一个名为test
的div,它将第一个lastId
定义为0
。循环应该处理获取最新的lastId
,但它没有。
我发现了什么:在ajaxPoll中没有编辑lastId
,它从div中获得正确的lastId,但不编辑lastId
。这几乎可以肯定这是一个范围问题
一个问题是ajaxPoll
。您创建要发送一次的数据,并且不会在每次轮询中重新评估。
另一个问题是lastId
对于ajaxGo
函数是本地的。把它移到外面。
这里有一个使用jQuery.ajax
和setInterval
:的jsfiddle
var lastId = 0;
function ajaxGo() {
$.ajax({
url: "/echo/html/",
type: "POST",
data: {
'last': lastId,
html: '<div class="message' + (parseInt(lastId) + 1) + '">' + (parseInt(lastId) + 1) + '</div>'
},
dataType: "html",
success: function(result) {
if (result) {
$(result).appendTo('#chat_log').show();
lastDiv = $('#chat_log').find('div:last-child');
lastId = lastDiv[0].className.substring(7);
console.log(lastId);
/* if (!hasFocus && !titleCurrentlyChanging) {
changeTitle();
}
soundHandle = document.getElementById('soundHandle');
soundHandle.src = '../Sounds/Message.wav';
soundHandle.play();*/
}
}
});
}
var timer = setInterval(ajaxGo, 1000);
某些与您的问题无关的代码被注释掉或省略。
如果这是一个范围问题,可能会通过放置来解决
var lastId = -1;
在代码顶部,然后用lastId = ...
替换var lastId = ...
。