2012-04-11 156 views
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); 
} 
?> 

任何想法,为什么不持续更新呢?

谢谢。

+2

作为一个方面说明,在你的代码中也有不少不好的做法。 – BenM 2012-04-11 13:54:07

+0

我想你错过了客户端和服务器端的区别 – 2012-04-11 13:55:12

+0

我刚刚开始学习js,所以我不希望我的代码有良好的做法直接蝙蝠。 – 2012-04-11 13:56:09

回答

4

因为每10毫秒你的JS解析原始聊天室的内容,你不会获取任何新的内容。你需要实现一个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); 
     } 
    }); 
}()); 

很明显,你会填充阿贾克斯处理您的需求,增加一些PARAMS像数据类型等,一些错误处理。

+0

很抱歉,你能否给我一些你的意思吗? – 2012-04-11 13:54:37

+0

查看更新的答案。 – AlienWebguy 2012-04-11 14:06:48

2

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

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

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

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

我建议你:

  1. 创建一个PHP脚本,输出数据在JSON格式
  2. 使用jQuery,特别是getJSON函数来获取该脚本的输出
  3. 你想要做什么该数据。