Discuz! 2.0 在短消息方面增加了一個羣聊的功能,在這裏介紹一下羣聊刷新顯示數據的過程

羣聊的刷新可以在後台 全局 - 站點功能 -   其他 裏面設置   羣聊消息內容自動刷新間隔 (秒)

從程序上我們可以看到 模板文件 ./template/default/home/space_pm.htm 文件輸出了 js

  1. <script type="text/javascript">
  2. var refresh = true;
  3. var refreshHandle = -1;
  4. var autorefresh = {$refreshtime};
  5. </script>
  1. <script type="text/javascript">
  2.         var msgListObj = $('msglist');
  3.         msgListObj.scrollTop = msgListObj.scrollHeight;
  4. function succeedhandle_pmsend(url, msg, values) {
  5.         var pObj = document.createElement("p");
  6.         pObj.className = 'xg1 mbn';
  7.         pObj.innerHTML = '<a
    href="home.php?mod=space&uid=$_G[uid]" target="_blank"
    >$_G[username]</a> &nbsp;'+ "{lang just_now}";
  8.         var pObjmsg = document.createElement("p");
  9.         pObjmsg.className = 'mbm';
  10.         var pmMsg = $('replymessage');
  11.         pObjmsg.innerHTML = bbcode2html(parseurl(pmMsg.value));
  12.         msgListObj.appendChild(pObj);
  13.         msgListObj.appendChild(pObjmsg);
  14.         msgListObj.scrollTop = msgListObj.scrollHeight;
  15.         pmMsg.value = "";
  16.         showCreditPrompt();
  17. }
  18.         function refreshMsg(refreshnow) {
  19.                 if(refresh) {
  20.                         if(autorefresh <= 0 || refreshnow){
  21.                                 var x = new Ajax();
  22.                             
       x.get('home.php?mod=spacecp&ac=pm&op=showchatmsg&inajax=1&daterange=$daterange&plid=$plid',
    function(s){
  23.                                         msgListObj.innerHTML = s;
  24.                                         msgListObj.scrollTop = msgListObj.scrollHeight;
  25.                                 });
  26.                                 autorefresh = {$refreshtime};
  27.                         }
  28.                         <!--{if $refreshtime}-->
  29.                         $('refreshtip').innerHTML = autorefresh + ' {lang next_refresh}';
  30.                         <!--{/if}-->
  31.                         autorefresh -= 2;
  32.                 } else {
  33.                         window.clearInterval(refreshHandle);
  34.                 }
  35.         }
  36.         <!--{if $refreshtime}-->
  37.         refreshHandle = window.setInterval('refreshMsg(0);', 2000);
  38.         <!--{/if}-->
  39.         hideMenu();
  40. </script>


用户發表羣聊時,程序通過 ajaxpost 向
home.php?mod=spacecp&ac=pm&op=send&pmid=$pmid&daterange=$daterange&handlekey=pmsend&pmsubmit=yes
地址提交表單

程序  ./source/include/spacecp/spacecp_pm.php   對 post 過來的數據進行處理入庫後返回

home.php?mod=space&do=pm&subop=view&touid='.$touid 到 ajaxpost 中所指的 pmforum_return 對象中類似

  1. <span
    id="pmforum_return"><script type="text/javascript"
    reload="1">if(typeof succeedhandle_pmsend=='function')
    {succeedhandle_pmsend('home.php?mod=space&do=pm&subop=view&touid=0',
    '操作成功 ', {'pmid':'10'});}</script></span>

則 js 執行 succeedhandle_pmsend 將消息輸出顯示出來

自動獲取短消息過程是當後台設置了消息刷新的時間 則模板會輸出顯示

  1. refreshHandle = window.setInterval('refreshMsg(0);', 2000);

即表示 羣聊頁會每 2 秒 執行一次 refreshMsg 函數

refreshMsg   函數 每次會在 羣聊界面上顯示 autorefresh 秒後刷新, autorefresh 該值最開始由後台所設置的刷新時間賦值

之後 每次遞減 2

當 autorefresh   值 減到 0 時 refreshMsg   執行 ajax 向
home.php?mod=spacecp&ac=pm&op=showchatmsg&inajax=1&daterange=$daterange&plid=$plid
請求

該地址包含的程序  ./source/include/spacecp/spacecp_pm.php   向 uc 接口取出最新的消息返回到函數

  1. function(s){
  2.                                         msgListObj.innerHTML = s;
  3.                                         msgListObj.scrollTop = msgListObj.scrollHeight;
  4.                                 }

輸出顯示

同樣用户可以點擊 界面上的   autorefresh 秒後刷新 字樣的進行手動刷新獲得最新的羣聊消息