Javascript 如何在ajax轮询中发送div的最后一个类?
我的ajaxPoll聊天系统有问题。我正在尝试将聊天消息的Javascript 如何在ajax轮询中发送div的最后一个类?,javascript,jquery,ajax-polling,Javascript,Jquery,Ajax Polling,我的ajaxPoll聊天系统有问题。我正在尝试将聊天消息的div的最后一个Id发送回php,因此查询只能显示高于上次发送的Id的结果 所有聊天信息都位于名为chat\u log的div中。消息周围将有一个带有消息id类的div。它将有文本message,然后是该消息的id,例如:class=“message543”。好的,为了让大家更容易理解,这里有一个HTML示例,它的结构和顺序都是正确的 <div id='chat_log'> <div class='message
div
的最后一个Id发送回php
,因此查询只能显示高于上次发送的Id的结果
所有聊天信息都位于名为chat\u log
的div
中。消息周围将有一个带有消息id类的div
。它将有文本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
消息id
但是,当非手动运行时(可能是因为它不在函数或循环中,或者其他什么原因),当存在id为1000
+的其他消息时,代码只发送“0
”。我还尝试了许多其他方法,比如setInterval
,等等。我认为可能是变量范围引起了问题,好像在调用轮询的success函数时,它不会调整lastId
变量。不过,我不完全确定情况是否如此。如果是这样的话,我将感谢您对如何修复变量范围以使代码正常工作的支持
另一方面,php正在成功运行,因此我不需要任何帮助
重要编辑(使问题更容易理解):代码
lastDiv = lastDiv = $('#chat_log').find('div:last-child');
lastId = lastDiv[0].className.substring(7);
…很好,它的周围区域(结构)似乎是问题所在。另外,where
与此where
无关,它只告诉php脚本从何处发送。我知道在first上附加了一个名为test
的div,它将第一个lastId
定义为0
。循环应处理获取最新的lastId
,但它不处理
我的发现:
lastId
未在ajaxPoll中编辑,它从div中获取正确的lastId,但不编辑lastId
。这几乎可以确定这是一个范围问题,一个问题是ajaxPoll。您创建要发送一次的数据,并且不会在每次轮询时重新评估该数据
另一个问题是lastId
对于ajaxGo
函数是本地的。把它搬到外面去
下面是一个使用jQuery.ajax
和setInterval
的
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=0;
函数ajaxGo(){
$.ajax({
url:“/echo/html/”,
类型:“POST”,
数据:{
“last”:lastId,
html:“”+(parseInt(lastId)+1)+“”
},
数据类型:“html”,
成功:功能(结果){
如果(结果){
$(结果).appendTo(“#聊天记录”).show();
lastDiv=$(“#聊天记录”).find('div:last child');
lastId=lastDiv[0].className.substring(7);
console.log(lastId);
/*如果(!hasFocus&&!标题当前更改){
changeTitle();
}
soundHandle=document.getElementById('soundHandle');
soundHandle.src='../Sounds/Message.wav';
声音手柄。播放()*/
}
}
});
}
var定时器=设置间隔(ajaxGo,1000);
一些与您的问题不相关的代码被注释掉或省略。如果是范围问题,可能会通过放置
var lastId = -1;
在代码顶部,然后将var lastId=…
替换为lastId=…
这是什么其中:where
?您在那里犯了某种错误。在DOMReady上,您正在添加一个div,该div的类为message0
,现在您的最后一个div返回0
。使用分隔符来获取值更容易:“message\u 0”,然后使用split(“\u0”)。问题与lastDiv=lastDiv=$(“#chat\u log”)无关。查找('div:last child');lastId=lastDiv[0].className.substring(7)代码>。未定义你没有读过“当有其他id为1000+的消息时”吗?@LeviMorrison这与这种情况无关,它只是告诉php它是从哪里发送的。回答很好,正是我想要的:)谢谢!
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;