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 秒后刷新 字样的进行手动刷新获得最新的群聊消息