前些天做了一个聊天室,基于XmlHttpRequest对象,使聊天不会刷新。用XmlDocument对象来保存聊天信息, 并保存至Application对象里面。客户端用Dom来解析聊天信息。Application对象还保存所有用户的所有聊天信息数量,在Session对象里面保存每个会话的聊天数量,每次会话判断Session和Application两个对象中的聊天数量之差X,并从Application中取出后面几条(X),并返回给客户端。
//创建通用的xmlRequest对象
function CreateXmlRequest()...{
var xmlhttp_request = false; 
try...{ 
if( window.ActiveXObject )...{ 
for( var i = 5; i; i-- )...{ 
try...{ 
if( i == 2 )...{
xmlhttp_request = new ActiveXObject( 
"Microsoft.XMLHTTP" );
}
else...{
xmlhttp_request = new ActiveXObject( 
"Msxml2.XMLHTTP." + i + ".0" );

xmlhttp_request.setRequestHeader("Content-Type","text/xml");

xmlhttp_request.setRequestHeader("Content-Type","gb2312"); 
}
break;
} 
catch(e)...{
xmlhttp_request = false;
}
}
}
else if( window.XMLHttpRequest )...{
xmlhttp_request = new XMLHttpRequest(); 
if (xmlhttp_request.overrideMimeType) ...{ 

xmlhttp_request.overrideMimeType('text/xml');
}
}
}
catch(e)
...{
xmlhttp_request = false;
}
return xmlhttp_request ;
}


var enterRoom=true;//标记用户是否第一次(刚刚)进入聊天室
var isLoadingMsg=true;//标记是否已经加载聊天信息
var myrequest=false;
//获取聊天信息
function getChatMessage()...{
isLoadingMsg=false;
myrequest=CreateXmlRequest();
xmlDom=new ActiveXObject("Microsoft.XMLDOM");//获取DOM对象
xmlDom.async=false;//在HTML读取前加载
myrequest.onreadystatechange=showChatMessage;
xmlDomStr="<control>";
xmlDomStr=xmlDomStr+"<enter>"+enterRoom+"</enter>";
xmlDomStr=xmlDomStr+"</control>";
xmlDom.loadXML(xmlDomStr);
enterRoom=false;
myrequest.open("POST","getXMLMessage.aspx?myDate="+new 
Date().getTime(),true);
myrequest.send(xmlDom);
}
//显示聊天信息
function showChatMessage()...{

if(myrequest.readyState==4 )...{ 
if(myrequest.status==200)...{
isLoadingMsg=true;
var myDom=myrequest.responseText;//获取返回XML数据
msgDom=new ActiveXObject("Microsoft.XMLDOM");
var msgDom=myrequest.responseXML;
msgDom.loadXML(myDom);
var strMessage="";
//(msgDom!=null)&&
if(myDom!="")...{
var 
messageNodes=msgDom.getElementsByTagName("message"); //获取所有message的结点
var chatmsgs=document.getElementById("ChatMessages");
orgMsg=chatmsgs.innerHTML;//获取原来的聊天信息
for(i=0;i<messageNodes.length;i++)...{
msgNode=messageNodes(i);//获取message的结点
//获取message结点下的元素
objText=msgNode.selectSingleNode("text").text;
objText=Check(objText);
objUser=msgNode.selectSingleNode("user").text;
objfont=msgNode.selectSingleNode("fontface").text;
objsize=msgNode.selectSingleNode("fontsize").text;
objColor=msgNode.selectSingleNode("color").text;
strMessage=strMessage+"<font face="+objfont+" size="+objsize+"
color="+objColor+"><B>"+objUser+"</B>:"+objText+"</font><br>";
}

if(strMessage!="")...{
strMessage=orgMsg+strMessage;

document.getElementById("ChatMessages").innerHTML=strMessage;//累加
}
//chatmsgs.scrollIntoView(false);//窗口滚动为false;
}
}
}
}
//更新消息
function updatechatMessage()...{
var chatmsg=document.getElementById("chatmsg");
var checkedValue=chatmsg.value;
var username=document.getElementById("username").value;
if(checkedValue=="")...{
errorToolTip("chatmsg","内容");
return;
}
if(username=="")...{
errorToolTip("username","用户名");
return;
}
var color=document.getElementById("msgcolor").value;
var fontsize=document.getElementById("chatFontSize").value;
var fontface=document.getElementById("chatFont").value;
if(chatmsg.value!="")...{
var strMessage=checkedValue;
sendrequest=CreateXmlRequest();
xmlDom=new ActiveXObject("Microsoft.XMLDOM");//获取DOM对象
xmlDom.async=false;
xmlDomStr="<message>";
xmlDomStr=xmlDomStr+"<text>"+strMessage+"</text>";//获取发送的消息
xmlDomStr=xmlDomStr+"<user>"+username+"</user>";//用户名
xmlDomStr=xmlDomStr+"<fontsize>"+fontsize+"</fontsize>";
xmlDomStr=xmlDomStr+"<fontface>"+fontface+"</fontface>";
xmlDomStr=xmlDomStr+"<color>"+color+"</color>";
xmlDomStr=xmlDomStr+"</message>";
xmlDom.loadXML(xmlDomStr);
sendrequest.onreadystatechange=getCountMsg;
sendrequest.open("POST","updateXMLMessage.aspx",true);
sendrequest.send(xmlDom);
chatmsg.value="";//清空输入框
}
}

//获取消息数量
function getCountMsg()...{
if(sendrequest.readyState==4 )...{ 
if(sendrequest.status==200)...{

//document.getElementById("countMsg").innerHTML=sendrequest.responseText
;
}
}
}
var oPopup = window.createPopup();
function errorToolTip(obj,obj2)
...{
/**//*500 80*/
var mytool=document.getElementById(obj);
var toolTop= mytool.offsetTop;
var toolLeft= mytool.offsetLeft+82;
oPopup.document.body.innerHTML 
="<div><center><img src="/ShavelingChat/images/info.gif 
"></img></center><br><color=red>"+obj2+"不能为空!</color></div>";
oPopup.show(toolLeft,toolTop , 80,80, 
chatmsg);
}

function Check(mytext)...{
var myvalue=ChangeFaceNoToImage(mytext);
var reImg= new RegExp("(gif|jpg|png|jpeg|bmp)$", "");
var isImg = reImg.test(myvalue);
var reUrl=new RegExp("http://([\w-]+\.)+[\w-]+(/[\w- 
./?%&=]*)?", "");
var isUrl = reUrl.test(myvalue);
if(isImg==true && isUrl==true)...{
// [!CDATA[ ]>
myvalue="<img src="+myvalue+"></img>";
}
return myvalue;
}

//把表情代码转为图象
function ChangeFaceNoToImage(ChatWord)
...{
for (var i = 0;i < 90;i ++)
...{
var changeStr = "<img src="images/face/" + i + ".gif">";
var pattern = new RegExp("\[face" + i + "\]");
pattern.global = true;
while (pattern.test(ChatWord))
...{
ChatWord = ChatWord.replace(pattern,changeStr);
}
}
return ChatWord;
}

//添加表情
function AddFace(FaceNo)
...{
document.getElementById("chatmsg").value += FaceNo;
GetFocus();
HideDiv();
}
//聊天输入框聚焦
function GetFocus()
...{
document.getElementById("chatmsg").focus();
}


//获取表情
function Getface()...{
var btnLeft=document.getElementById("faceBox").style.left;
var tem=1;
var falg=0;
for(j=0;j<90;j++)...{
falg=falg+1;
if(falg>10)...{
tem=tem+1;
falg=1;
}
document.getElementById("Face"+tem).innerHTML += 
"<img src="images/face/" + j + ".gif" 
onclick="javascript:AddFace('[face" + j + "]');" 
onmouseout="javascript:this.style.border ='0';" 
onmouseover="javascript:this.style.border ='1px solid';" alt="点击插
入表情"/> ";
}
var handle=document.getElementById("faceBox");
var pos = getPosition(handle);
var t = pos.top;
var l = pos.left;
document.getElementById("mydownDiv").style.left=l-200;
document.getElementById("mydownDiv").style.top=t+22;
document.getElementById("mydownDiv").style.display="";
}


function HideDiv()...{
document.getElementById("mydownDiv").style.display="none";
}

function MyHi