如何在ajax轮询中发送div的最后一个类



我的ajaxPoll聊天系统出现问题。我正在尝试将聊天消息的div的最后一个Id发送回php,因此查询只能显示高于上次发送的Id的结果。

所有聊天消息都在一个名为chat_logdiv中。消息周围会有一个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.ajaxsetInterval:的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 = ...

相关内容

  • 没有找到相关文章

最新更新