本帖最后由 云天一 于 2011-4-29 12:31 编辑
*************************************************
** 本教程基于版本:Discuz! X 2.0 **
*************************************************
Discuz! 2.0 在短消息方面增加了一个群聊的功能,在这里介绍一下群聊刷新显示数据的过程
群聊的刷新可以在后台 全局 - 站点功能 - 其他 里面设置 群聊消息内容自动刷新间隔(秒)
从程序上我们可以看到 模板文件 ./template/default/home/space_pm.htm 文件输出了js
- <script type="text/javascript">
- var refresh = true;
- var refreshHandle = -1;
- var autorefresh = {$refreshtime};
- </script>
复制代码- <script type="text/javascript">
- var msgListObj = $('msglist');
- msgListObj.scrollTop = msgListObj.scrollHeight;
- function succeedhandle_pmsend(url, msg, values) {
- var pObj = document.createElement("p");
- pObj.className = 'xg1 mbn';
- pObj.innerHTML = '<a href="home.php?mod=space&uid=$_G[uid]" target="_blank" class="xi2">$_G[username]</a> '+ "{lang just_now}";
- var pObjmsg = document.createElement("p");
- pObjmsg.className = 'mbm';
- var pmMsg = $('replymessage');
- pObjmsg.innerHTML = bbcode2html(parseurl(pmMsg.value));
- msgListObj.appendChild(pObj);
- msgListObj.appendChild(pObjmsg);
- msgListObj.scrollTop = msgListObj.scrollHeight;
- pmMsg.value = "";
- showCreditPrompt();
- }
- function refreshMsg(refreshnow) {
- if(refresh) {
- if(autorefresh <= 0 || refreshnow){
- var x = new Ajax();
- x.get('home.php?mod=spacecp&ac=pm&op=showchatmsg&inajax=1&daterange=$daterange&plid=$plid', function(s){
- msgListObj.innerHTML = s;
- msgListObj.scrollTop = msgListObj.scrollHeight;
- });
- autorefresh = {$refreshtime};
- }
- <!--{if $refreshtime}-->
- $('refreshtip').innerHTML = autorefresh + ' {lang next_refresh}';
- <!--{/if}-->
- autorefresh -= 2;
- } else {
- window.clearInterval(refreshHandle);
- }
- }
- <!--{if $refreshtime}-->
- refreshHandle = window.setInterval('refreshMsg(0);', 2000);
- <!--{/if}-->
- hideMenu();
- </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 对象中类似- <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 将消息输出显示出来
自动获取短消息过程是当后台设置了消息刷新的时间 则模板会输出显示- 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 接口取出最新的消息返回到函数- function(s){
- msgListObj.innerHTML = s;
- msgListObj.scrollTop = msgListObj.scrollHeight;
- }
复制代码 输出显示
同样用户可以点击 界面上的 autorefresh 秒后刷新 字样的进行手动刷新获得最新的群聊消息
|