6

背景信息

我现在正在摆弄一些 PHP 和 AJAX,试图让代码为包含注释的自动刷新 div(每 10 秒)工作。

这是我用来刷新 div 的 javascript 代码。

<script type="text/javascript">// <![CDATA[
$(document).ready(function() {
        $.ajaxSetup({ cache: false }); 
            setInterval(function() {
                    $('#content_main').load('/feed_main.php');
        }, 5000);  
});
// ]]></script>

将填充名为“content_main”的 div 的代码位于 feed_main.php 中,本质上是访问数据库并回显最新的评论......

问题

如果其中的数据自上次加载以来没有更改,是否可以仅加载 div“content_main”?

我的逻辑

因为我对 javascript 和 AJAX 比较陌生,所以我不太清楚如何做到这一点,但我的逻辑是:

第一次运行..

  • 从 feed_main.php 文件加载数据
  • 创建一个唯一值(可能是哈希值?)来识别 3 个唯一评论

每隔一段时间就运行一次...

  • 从 feed_main.php 文件加载数据
  • 创造新的独特价值
  • 用前一个值检查这个值
  • 如果它们相同,请不要刷新 div,只需保持原样,但如果它们不同,则刷新..

之所以要这么做,是因为评论里一般都附有图片,而且每次看到图片都重新加载很烦人。

对此的任何帮助将不胜感激。

4

3 回答 3

5

不久前我遇到过类似的问题,我假设您使用 mysql 或其他东西作为您的评论存储服务器端?

我通过首先将时间戳整数列添加到我的 mysql 表来解决我的问题,然后当我添加一个新行时,我只是time()用来保存当前时间。

mysql 行插入示例:

$query = "INSERT INTO comments (name, text, timestamp) VALUES ('". $name ."', '". $text ."',". time() .");";

第二步是对您从服务器端发送的数据进行 json_encode:

$output = array();

if ($html && $html !== '') {   // do we have any script output ?
  $output['payload'] = $html;  // your current script output would go in this variable
}
$output['time'] = time();      // so we know when did we last check for payload update

$json = json_encode($output, ((int)JSON_NUMERIC_CHECK)); // jsonify the array
echo $json;                    // send it to the client

因此,现在您的服务器端脚本不再是纯 html,而是返回如下内容:

{
  "payload":"<div class=\"name\">Derpin<\/div><div class=\"msg\">Foo Bar!<\/div>",
  "time":1354167493
}

您可以简单地在 javascript 中获取数据:

<script type="text/javascript"> // <![CDATA[

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) {        // new data
        lastcheck = result.time;   // update stored timestamp
        content_main.html(result.payload + content_main.html()); // update html element
      } else {                     // no new data, update only timestamp
        lastcheck = result.time;
      }
    }
  });
}

// ]]> </script>

这几乎可以处理服务器和客户端之间的通信,现在您只需像这样查询数据库:

$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,它还具有将大量工作从服务器卸载到客户端的优势:)。您还可以更好地控制一次要显示多少评论。


我做了一些相当大的假设,你必须修改代码以满足你的需要。如果你使用我的代码,而你的 cat|computer|house 碰巧爆炸了,你可以保留所有的碎片 :)

于 2012-11-29T06:35:39.837 回答
3

这个怎么样:

<script type="text/javascript">
    // <![CDATA[
    $(function () {

        function reload (elem, interval) {
            var $elem = $(elem);
            // grab the original html
            var $original = $elem.html();
            $.ajax({
                cache : false,
                url : '/feed_main.php',
                type : 'get',
                success : function (data) {
                    // compare the result to the original
                    if ($original == data) {
                        // just start the timer if the data is the same
                        setTimeout(function () {
                            reload(elem, interval)
                        }, interval);
                        return;
                    }
                    // or update the html with new data
                    $elem.html(data);
                    // and start the timer
                    setTimeout(function () {
                        reload(elem, interval)
                    }, interval);
                }
            });
        }

        // call it the first time
        reload('#content_main', 10000);
    });
    // ]]>
</script>

这只是一个让你继续前进的想法,它不处理错误或超时。

于 2012-11-27T08:05:04.400 回答
0

最简单的代码

setInterval(function()
    { 
        $.ajax({
          type:"post",
          url:"uourpage.php",
          datatype:"html",
          success:function(data)
          {
            $("#div").html(data);
          }
        });
    }, 5000);//time in milliseconds 
于 2018-01-05T08:00:28.170 回答