无刷新聊天室的技术实现

类别:Asp 点击:0 评论:0 推荐:

先简单说明下

服务端

用程序生成需要的 XML 文件

客户端

利用 XMLHTTP 或者 DSO(注意状态)  定时刷新需要的数据

相对来说 DSO 可以映射成 recordset 操作比较简单

以下是我简单写着玩的东西 不是完整部分 而且十分简陋

只是代码片段 但作为技术参考已经足够

需要 MSXML 4.0

服务端 我写了两个构造函数 分别是 聊天内容 聊天用户


<script language="JScript" runat="server">
function SLIGHTBOYChat()
{

 this.ID;
 this.XMLDOMElement = Server.CreateObject("Msxml2.FreeThreadedDOMDocument.4.0")

 this.Add = function(Name, Content, Append)
 {
  var root = this.XMLDOMElement.documentElement;
  var newItem = this.XMLDOMElement.createElement("Item");
  var newItemName = this.XMLDOMElement.createElement("Name");
  var newItemNameValue = this.XMLDOMElement.createCDATASection(Name);
  newItemName.appendChild(newItemNameValue)
  var newItemContent = this.XMLDOMElement.createElement("Content");
  var newItemContentValue = this.XMLDOMElement.createCDATASection(Content);
  newItemContent.appendChild(newItemContentValue)
  var newItemAppend = this.XMLDOMElement.createElement("Append");
  newItemAppend.text = Append;
  newItem.appendChild(newItemName);
  newItem.appendChild(newItemContent);
  newItem.appendChild(newItemAppend);
  if ( root.childNodes.length > 10 )
  {
   root.removeChild(root.firstChild)
  }
  root.appendChild(newItem)
 }
 this.Save = function()
 {
  Application("ChatContent") = this.XMLDOMElement.xml;
 }
 this.GUID = function(PushGUID)
 {
  if ( PushGUID.Count > 0 )
  {
   this.ID = PushGUID;
  }
  else
  {
   this.ID = "";
  }
 }
 this.Xml = function()
 {
  if ( this.ID != "" )
  {
   var XMLDOMElementString = "<?xml version=\"1.0\" encoding=\"gb2312\"?><Chat>";
   var items = Chat.XMLDOMElement.selectNodes("//Item[Append > "+ this.ID +"]")
   for (var item = items.nextNode(); item; item = items.nextNode())
   {
    XMLDOMElementString += item.xml;
   }
   XMLDOMElementString += "</Chat>";
   if ( items.length > 0 )
   {
    return XMLDOMElementString;
   }
   else
   {
    return;
   }
  }
  else
  {
   return this.XMLDOMElement.xml.replace("<?xml version=\"1.0\"?>","<?xml version=\"1.0\" encoding=\"gb2312\"?>");
  }
  
 }
 this.Load = function()
 {
  if ( Application("ChatContent") == "" | typeof(Application("ChatContent")) == "undefined" )
  {
   Application("ChatContent") = "<?xml version=\"1.0\" encoding=\"GB2312\"?><Chat><Item><Name>slightboy</Name><Content>欢迎 ^^</Content><Append>"+ new Date().getTime() +"</Append></Item></Chat>";
  }
  this.XMLDOMElement.loadXML(Application("ChatContent"));

 }
 this.Empty = function()
 {
  Application("ChatContent") = "<?xml version=\"1.0\" encoding=\"GB2312\"?><Chat><Item><Name>slightboy</Name><Content>欢迎 ^^</Content><Append>"+ new Date().getTime() +"</Append></Item></Chat>";
 }

 this.Load();
}


function SLIGHTBOYChatList()
{
 this.XMLDOMElement = Server.CreateObject("Msxml2.FreeThreadedDOMDocument.4.0")

 this.Add = function(Name, Level)
 {
  var root = this.XMLDOMElement.documentElement;
  var newItem = this.XMLDOMElement.createElement("Item");
  var newItemName = this.XMLDOMElement.createElement("Name");
  var newItemNameValue = this.XMLDOMElement.createCDATASection(Name);
  newItemName.appendChild(newItemNameValue)
  var newItemLevel = this.XMLDOMElement.createElement("Level");
  var newItemLevelValue = this.XMLDOMElement.createCDATASection(Level);
  newItemLevel.appendChild(newItemLevelValue)
  var newItemAppend = this.XMLDOMElement.createElement("Append");
  newItemAppend.text = Append;
  newItem.appendChild(newItemName);
  newItem.appendChild(newItemLevel);
  root.appendChild(newItem)
 }
 this.Save = function()
 {
  Application("ChatUser") = this.XMLDOMElement.xml;
 }
 this.Xml = function()
 {
  return this.XMLDOMElement.xml.replace("<?xml version=\"1.0\"?>","<?xml version=\"1.0\" encoding=\"gb2312\"?>"); 
 }
 this.Load = function()
 {
  if ( Application("ChatUser") == "" | typeof(Application("ChatUser")) == "undefined" )
  {
   Application("ChatContent") = "<?xml version=\"1.0\" encoding=\"GB2312\"?><Chat></Chat>";
  }
  this.XMLDOMElement.loadXML(Application("ChatUser"));

 }
 this.Remove = function()
 {
  var RemoveTimer = new Date().getTime();
  RemoveTimer -= 300000;
  var root = this.XMLDOMElement.documentElement;
  var RemoveNodes = root.selectNodes("//Item[Append < "+ RemoveTimer +"]");
  while (RemoveNodes.peekNode() != null)
  {
   RemoveNodes.removeNext();
  }
 }
 this.Load();
}
</script>


客户端聊天内容显示页面


<html>
<meta http-equiv='Content-Type' content='text/html; charset=gb2312'>
<script language="JavaScript">
function SLIGHTBOYChat()
{
 this.GUID = "";
 this.recordset;
 var Timer = new Date();
 this.CheckState = function()
 {
  if ( xmlChat.readyState == "complete" )
  {
   this.recordset = xmlChat.recordset;
   this.Item();
  }
 }
 this.Item = function()
 {
  try
  {
   var PushString;

   this.recordset.MoveLast();
   if ( this.recordset("Append").value !=  this.GUID)
   {
    this.GUID = this.recordset("Append").value;
   }
   else
   {
    this.recordset = null;
    return;
   }
   this.recordset.MoveFirst();
   while (!this.recordset.EOF)
   {

    Timer.setTime(this.recordset("Append").value)
    PushString = this.recordset("Name").value +" 说: "+ this.recordset("Content").value +" <small>"+ Timer.toLocaleString() +"</small>";
    this.Push(PushString);
    this.recordset.moveNext();
   }
   this.recordset = null;
  }
  catch(e)
  {
   return;
  }


 }

 this.Push = function(PushString)
 {
  var ChatItem = document.createElement("li");
  ChatItem.innerHTML = PushString;
  ChatList.insertAdjacentElement("afterBegin",ChatItem);
 }
 this.Load = function()
 {
  xmlChat.src = "background.asp?GUID="+ this.GUID;
 }
 this.Remove = function()
 {
  try
  {
   var Removelength = ChatList.children.length;
   for (var i = 0; i < Removelength; i++)
   {
    ChatList.removeChild(ChatList.children(0));
   }
  }
  catch(e)
  {
  }
 }
}


var Chat = new SLIGHTBOYChat();
window.setInterval("Chat.Load()", 5000);
</script>
</head>

<body>
<xml id="xmlChat" src="background.asp" onreadystatechange="Chat.CheckState()"></xml>
<ul id="ChatList" style="list-style: none;margin: 0px;">
<li>欢迎访问 SLIGHTBOY XML ChatRoom...<small>(SLIGHTBOY)</small></li>
</ul>
</body>
</html>

本文地址:http://com.8s8s.com/it/it7657.htm