所以我正在为我的博客cms项目制作评论系统。我想要实现的是每秒从另一个从MySql表中获取数据的php文件(ex-comment.php)中获取注释,并将其显示在div中 -
<div class="results" id="result"></div>
我能够成功完成,文本注释加载得很好,但图像注释(包含图像的注释)每秒闪烁一次。 可能是由于AJAX每秒刷新完整的div。 如果有人能帮助我弄清楚如何阻止这种闪烁,我真的很感激。 我的JavaScript代码是 -
<script>
function refresh_div() {
jQuery.ajax({
url:'comment.php',
type:'POST',
success:function(results) {
jQuery(".result").html(results);
var message=$('#result');
message.scrollTop(message[0].scrollHeight);
}
});
}
t = setInterval(refresh_div,1000);
</script>
如果需要,这里是comment.php文件 -
<?php
session_start();
if(!isset($_SESSION['uid'])){
header('location:login.php');
}
include('config.php');
$sql = "SELECT * FROM messages ORDER BY id ASC LIMIT 0, 30 ";
$result = mysql_query($sql);
while($row = mysql_fetch_array($result)) {
$uname=$row['uname'];
$message=$row['message'];
echo "<span>".$uname."</span>";
echo ": ";
echo "<span style='font-family:myfont2;'>".$message."</span>";
echo "<br>";
}
?>
我读到图像缓存可以解决问题,但我希望只在可能的情况下使用AJAX解决方案。
编辑 - 你们建议我保留旧邮件并“只获取ajax中的最新数据”。我相信我不能靠自己做这件事并期待一些代码帮助。
由于
额外注意 - 这是我在这里的第一个问题,所以我很抱歉,如果我没有问好或解释得很好,或者问我不应该问的问题。希望你们那里的好人明白:)
答案 0 :(得分:2)
您可以考虑使用Etags。
这个想法很简单 - comments.php
添加了一个额外的HTTP标头(因此没有破坏现有功能),这在某种程度上允许客户端(您的Javascript)询问服务器&#34; 仅如果更新的内容自我已有的版本&#34;)以后发送给我,我将发送给我。
服务器端需要生成某种确定性值(只有在数据库中的数据发生变化时才会发生变化 - 如SHA哈希),并将其作为Etag值与响应一起提供。
您的客户端(jQuery可以为您执行此操作)缓存Etag值,并且在将来的请求中包括请求中的缓存Etag。如果服务器确定新响应会导致相同的Etag(没有任何更改) - 它会以304 Not Modified
响应。
维基百科关于Etags:https://en.wikipedia.org/wiki/HTTP_ETag
jQuery中的Etags(请参阅页面上的&#34; ifModified
&#34;)http://api.jquery.com/jquery.ajax/
快速演示在PHP中执行此操作:https://css-tricks.com/snippets/php/intelligent-php-cache-control/
他们在这里使用磁盘上文件的修改时间和MD5哈希值。您需要修改这些值以适合您的SQL查询结果(您可以根据注释表中的自动递增主键,例如加上DEFAULT CURRENT_TIMESTAMP()
)。