0

所以我正在开发一个 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部分:

<?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);
}
?>

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

谢谢。

4

2 回答 2

4

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

而不是这个:

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 等,以及一些错误处理。

于 2012-04-11T13:53:28.870 回答
2

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

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

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

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

我建议你:

  1. 创建一个以JSON格式输出数据的 PHP 脚本
  2. 使用jQuery,特别是getJSON函数来检索该脚本的输出
  3. 用这些数据做你想做的事。
于 2012-04-11T13:57:33.127 回答