2012-04-11 158 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. 你想要做什麼該數據。