我不久前也遇到过类似的问题,我猜你在服务器端使用了mysql或其他数据库来存储评论?
我通过在mysql表中首先添加时间戳整数列来解决我的问题,然后当我添加新行时,我只需简单地使用time()
保存当前时间。
mysql插入行示例:
$query = "INSERT INTO comments (name, text, timestamp) VALUES ('". $name ."', '". $text ."',". time() .");";
第二步是将您从服务器端发送的数据进行json_encode:
$output = array();
if ($html && $html !== '') {
$output['payload'] = $html;
}
$output['time'] = time();
$json = json_encode($output, ((int)JSON_NUMERIC_CHECK));
echo $json;
因此,现在您的服务器端脚本返回的不再是纯html,而是类似于以下内容:
{
"payload":"<div class=\"name\">Derpin<\/div><div class=\"msg\">Foo Bar!<\/div>",
"time":1354167493
}
您可以很简单地在Javascript中获取数据:
您可以使用以下代码:
<script type="text/javascript">
var lastcheck;
var content_main = $('#content_main');
pollTimer = setInterval(function() {
updateJson();
}, 10000);
function updateJson() {
var request = '/feed_main.php?timestamp='+ (lastcheck ? lastcheck : 0);
$.ajax({
url: request,
dataType: 'json',
async: false,
cache: false,
success: function(result) {
if (result.payload) {
lastcheck = result.time;
content_main.html(result.payload + content_main.html());
} else {
lastcheck = result.time;
}
}
});
}
这基本上处理了服务器和客户端之间的通信,现在您只需查询数据库,如下所示:
$timestamp = 0;
$where = '';
if (isset($_GET['timestamp'])) {
$timestamp = your_arg_sanitizer($_GET['timestamp']);
}
if ($timestamp) {
$where = ' WHERE timestamp >= '.$timestamp;
}
$query = 'SELECT * FROM comments'. $where .' ORDER BY timestamp DESC;';
时间戳会被传递来回,客户端始终发送服务器在前一次查询中返回的时间戳。你的服务器只会发送自上次检查以来提交的评论,并且你可以像我所做的那样将它们作为html的开头。 (警告:我没有对此进行任何合理性控制,你的评论可能会变得非常长)由于您每10秒轮询新数据,因此您可能希望考虑通过ajax调用发送纯数据以节省大量带宽(仅包含时间戳的JSON字符串,约为20个字节)。然后,您可以使用JavaScript生成HTML,这也具有将很多工作从服务器转移到客户端的优点:)。您还将获得更精细的控制权,可以一次显示多少评论。
我做了一些相当大胆的假设,您需要修改代码以适应您的需求。如果您使用我的代码,而您的猫|计算机|房子碰巧爆炸了,您可以保留所有碎片:)