所以我在为我的博客cms项目做一个评论系统。我想要实现的是每秒钟从另一个php文件(ex- comment.php),这是从MySql表中获取数据,并显示在一个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>
这里是注释。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解决方案只有在可能的情况下。
感谢EDIT-你们建议我保持旧消息加载和"在ajax中只获取最新的数据"。我相信我自己不能做到这一点,并期待一些代码的帮助。
额外说明-这是我在这里的第一个问题,所以我的道歉,如果我没有问或解释得很好或问了一些我不应该问的问题。希望你们这些好心人能理解:)
你可以考虑使用Etags
这个想法很简单- comments.php
添加了一个额外的HTTP头(因此不会破坏现有的功能),这在某种程度上允许客户端(你的Javascript)要求服务器"只发送给我更新的内容,如果它已经改变了我已经有的版本")。
服务器端需要生成某种类型的确定值(只有当数据库中的数据改变时才会改变——比如SHA散列),并将其作为Etag值与响应一起提供。
你的客户端(jQuery可以为你做这件事)缓存Etag值,并且在以后的请求中包含缓存的Etag。如果服务器确定新的响应将导致相同的Etag(没有更改)-它响应一个304 Not Modified
。
Wikipedia on Etags: https://en.wikipedia.org/wiki/HTTP_ETag
jQuery中的Etags(参见页面上的"ifModified
"):http://api.jquery.com/jquery.ajax/
在PHP中快速演示:https://css-tricks.com/snippets/php/intelligent-php-cache-control/
这里他们使用磁盘上文件的修改时间和MD5哈希值。您需要修改这些值,使其适合您的SQL查询结果(例如,您可以基于注释表中的自动递增主键,再加上一个DEFAULT CURRENT_TIMESTAMP()
)。