自动更新聊天框

时间:2012-04-11 13:50:18

标签: php javascript

所以我正在开发一个javascript / php聊天框。一切都有效,除了它更新我的div的内容(这个工作一次,但之后它不会在新消息放入数据库时​​不断更新)。这是我的代码:

Javascript部分:

   <script language=javascript type='text/javascript'> 

        setInterval(function () {

            var arrayOfObjects = <?print_r(getChatArray());?>;
            var chat = "";

            for (var i = 0; i < arrayOfObjects.length; i++) {
                var object = arrayOfObjects[i];

                chat += "["+object.date+"]"+object.op+": " + object.msg + "</br>";
            }
            $('#chat').html(chat);

        }, 10);
    </script>

Php part:

<?php
function getChatArray() {
    $result = mysql_query("SELECT * FROM shouts ORDER BY id DESC"); 
    $to_encode = array();

    $count = mysql_num_rows($result);
    $size = 0;
        if($count > 0) {
            while($row = mysql_fetch_assoc($result)) {
              $to_encode[$size]['id'] = $row['id'];
              $to_encode[$size]['msg'] = $row['msg'];
              $to_encode[$size]['op'] = $row['op'];
              $to_encode[$size]['date'] = $row['date'];
              $size += 1;
            } 

        } else {
            return "None";
        }

return json_encode($to_encode);
}
?>

有关为什么不会不断更新它的任何想法?

感谢。

2 个答案:

答案 0 :(得分:4)

因为您的JS每隔10毫秒就会解析原始聊天室内容,所以您不会获取任何新内容。你需要实现一个ajax调用,我强烈建议将setInterval更改为一个递归的setTimeout,使用更真实的延迟500ms,这样你就不会杀死客户端。

而不是:

setInterval(function() {

    var arrayOfObjects = <?print_r(getChatArray());?>;
    ...

您可以使用以下内容:

(function updateChat(){

    var arrayOfObjects, 
        chat, 
        max,
        _object,
        i = 0;

    $.ajax({
        url : '/getChatArray.php', // php echoes the json
        success: function(arrayOfObjects){
            for (max = arrayOfObjects.length; i < max; i++) {
                _object = arrayOfObjects[i];
                chat += "["+_object.date+"]"+_object.op+": " + _object.msg + "</br>";
            }
            $('#chat').html(chat);
            setTimeout(updateChat, 500);
        }
    });
}());

显然,你会根据需要填充ajax处理程序,添加一些像dataType等更多的参数,以及一些错误处理。

答案 1 :(得分:2)

您的数据库内容只会在初始导航时输出到页面。 这段代码:

var arrayOfObjects = <?print_r(getChatArray());?>;

当PHP呈现页面时,只会输出getChatArray()返回的内容。因此,脚本只能在渲染时看到该函数的一种状态返回。

您需要使用AJAX异步检索数据库中的内容。

我建议你:

  1. 创建一个PHP脚本,以JSON格式
  2. 输出您的数据
  3. 使用jQuery,特别是getJSON函数来检索该脚本的输出
  4. 执行您想要处理的数据。