当AJAX取出时,图像每秒刷新一次,导致闪烁和闪烁

时间:2016-11-03 12:17:52

标签: php ajax

所以我正在为我的博客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中的最新数据”。我相信我不能靠自己做这件事并期待一些代码帮助。

由于

  

额外注意 - 这是我在这里的第一个问题,所以我很抱歉,如果我没有问好或解释得很好,或者问我不应该问的问题。希望你们那里的好人明白:)

1 个答案:

答案 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())。