AJAX聊天室小DEMO(讨厌JS,IE下有问题已解决)

2024-02-10 16:30

本文主要是介绍AJAX聊天室小DEMO(讨厌JS,IE下有问题已解决),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

太闲啦,太闲啦,连续一月没上课了.不知他们想我没.昨QQ上一JJ给我看她写的聊天室,刷的眼难受,让我帮她写个不刷新的给她看.就是闲嘛,一切都是Teach Myself,从来没人指导过我.想帮帮她.偶尔有个人帮我我也很感动.顺便自个学点东西吧.一直没用在CNBLOGS上东西,上次发错了,发到首页上去了,写的一个数据结构的代码片断,一大哥骂我不写注释,原来首页就是那个意思,现在我没事就往首页上发,旨在寻人骂我.我是菜鸟我怕谁,PS:在此之前我只懂点AJAX原理,对框架一无所知.以下是DEMO.发上来主要是给大家批评的还有点问题想请教.
我用XML做一个队列类似的东西存储10条信息.先入先出.再用ajax取出信息反应到聊天窗口,聊天窗口1秒刷一次
default.aspx页 表单部分
下面是ajax_chat.js代码
             var  sendReq  =  createAjaxObj();
            
var  receiveReq  =  createAjaxObj();
            
var  mTimer;
            
var  lastMessage  =   0 ;   // 最后一条Message ID值
             var  n_messages = 0 ;   // XML中的MESSAGE节点数,我设的是10条
             var  diff = 0 ;
            
var  chat_div  =  document.getElementById('div_chat');
            
function  startChat()
             
        
function  createAjaxObj()
{
//创建兼容的的xmlhttp对象
    var xmlhttp;
     
try
        
{
        xmlhttp
=new ActiveObject('Msxml2.XMLHTTP');
        }

        
catch(e)
        
{
            
try
            
{
            xmlhttp
=new ActiveObject('Microsoft.XMLHTTP');
            }

            
catch(e)
            
{
                
try
                
{
                xmlhttp
=new XMLHttpRequest();
                }

                
catch(e){}
            }

        }

       
return xmlhttp;
}

// 获取XML文本
function  getChatText() 
{

//判断上次请求的状态是否完成或是还未发送请求
    if (receiveReq.readyState == 4 || receiveReq.readyState == 0{
        
//从content.xml获取聊天内容
    receiveReq.open("get","content.xml");
    
//当请求状态改变时调用handleReceiveChat方法
        receiveReq.onreadystatechange = handleReceiveChat; 
        receiveReq.send(
null);//因为是get方法所以发送请求null
    }
            
}

function  handleReceiveChat() 
{

    
if (receiveReq.readyState == 4)
     
{//此时请求已经完成
       //获得显示消息的图曾层元素
        var chat_div = document.getElementById('div_chat');
        
//获得返回后的XML文件
        var xmldoc = receiveReq.responseXML;
        
//得到所有的新的消息记录
        var message_nodes = xmldoc.getElementsByTagName("message"); 
        n_messages 
= message_nodes.length;
        

        
var id=message_nodes[n_messages-1].getAttribute("id");
        lastMessage
=getCookie("lastMessage");
        
if(lastMessage==null)
        
{
            addCookie(
"lastMessage","0",10);
            lastMessage
=getCookie("lastMessage");
         }

         
         
if(id-lastMessage>=n_messages)
         
{
          
var i=0;
            diff
=n_messages;
            
while((message_nodes[n_messages-1].getAttribute("id")>=lastMessage)&&i<=diff-1)
            
{
                
var user_node = message_nodes[i].getElementsByTagName("user");
                
var text_node = message_nodes[i].getElementsByTagName("text");
                
var time_node = message_nodes[i].getElementsByTagName("time");
                chat_div.innerHTML 
+= '(<font class="chatUser">'+user_node[0].firstChild.nodeValue + '</font>)&nbsp;said at &nbsp;';
                chat_div.innerHTML 
+= '<font class="chatTime">+ time_node[0].firstChild.nodeValue + '</font><br />';
                chat_div.innerHTML 
+= '<span class="title">'+text_node[0].firstChild.nodeValue + '</span><br />';
                chat_div.scrollTop 
= chat_div.scrollHeight;
                
//每循环一条消息,记录到id到,lastMessage的cookie中        
                lastMessage = (message_nodes[i].getAttribute("id"));
                deleteCookie(
"lastMessage");
                addCookie(
"lastMessage",lastMessage,5);
                
                 i
++;
              
// alert("this lastMessage:"+lastMessage);    
                 
            }

         }

         
else
         
{
            
while(message_nodes[n_messages-1].getAttribute("id")>lastMessage)
            
{
                
var dif=message_nodes[n_messages-1].getAttribute("id")-lastMessage;
                
var temp=n_messages-dif;
                
if(dif!=0)
                
{
                
var user_node = message_nodes[temp].getElementsByTagName("user");
                
var text_node = message_nodes[temp].getElementsByTagName("text");
                
var time_node = message_nodes[temp].getElementsByTagName("time");
                chat_div.innerHTML 
+= '(<font class="chatUser">'+user_node[0].firstChild.nodeValue + '</font>)&nbsp;said at &nbsp;';
                chat_div.innerHTML 
+= '<font class="chatTime">+ time_node[0].firstChild.nodeValue + '</font><br />';
                chat_div.innerHTML 
+= '<span class="title">'+text_node[0].firstChild.nodeValue + '</span><br />';
                chat_div.scrollTop 
= chat_div.scrollHeight;
                
//每循环一条消息,记录到全局变量lastMessage的Cookie中        
          
                deleteCookie(
"lastMessage");
                 lastMessage
++;
                addCookie(
"lastMessage",lastMessage,1);
               
                temp
++;
                }

              
               
//alert("this lastMessage:"+lastMessage+"getAttribute:"+message_nodes[n_messages-1].getAttribute("id"));    
                 
            }

         }

         
       
    }

}

// 发送聊天内容
function  sendChatText()
 
{
       
if(document.getElementById('userName').value=='annoymous')
       
{
            alert(
"Input your name!");
            
return;
       }

//如果输入的消息为空,提示用户输入
    if(document.getElementById('txt_message').value == '')
     
{
        alert(
"You have not entered a message");
        
return;
    }

    
//判断上次发送消息请求的状态是否完成或是还未发送请求
    if (sendReq.readyState == 4 || sendReq.readyState == 0
    
{
       
//保存消息的服务器地址
        var submitURL = "sendMessage.aspx?userName="+document.getElementById('userName').value+"&msg="+document.getElementById('txt_message').value;
        sendReq.open(
"POST",  submitURL , true);//建立请求连接
        sendReq.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
        sendReq.onreadystatechange 
= handleSendChat; //当请求状态改变时调用handleSendChat方法
        sendReq.send(null);//发送请求
       
        document.getElementById('txt_message').value 
= '';//设置提交消息文本框为空
      
    }
                            
}

function  handleSendChat()
 
{
 
//发送后强制执行一次获取聊天内容一次

    
//lastMessage =getCookie("lastMessage");
    getChatText();
}


// 三个JS常用的函数网上抄的
function  addCookie(name,value,expireMin)
{
    
var cookieString=name+"="+escape(value);
    
//判断是否设置过期时间
    if(expireMin>0){
        
var date=new Date();
        date.setTime(date.getTime
+expireMin*60*1000);
        cookieString
=cookieString+"; expire="+date.toGMTString();
    }

    document.cookie
=cookieString;
}

function  getCookie(name)
{
//获取指定名称的Cookie值
    var strCookie=document.cookie;
    
var arrCookie=strCookie.split(";");
    
for(var i=0;i<arrCookie.length;i++)
    
{
        
var arr=arrCookie[i].split("=");
        
if(arr[0]==name)
        
return arr[1];
    }

    
return null;
}

  
function  deleteCookie(name)
  
{
     
var expires=new Date();
     expires.setTime(expires.getTime()
-1);
     addCookie(name,
"Delete Cookie",expires);
   }



点击发送 sendMessage.aspx
public  partial  class  sendMessage : System.Web.UI.Page
{
    XmlDocument doc;
    
string filePath; //聊天内容存储的XML文件
    protected void Page_Load(object sender, EventArgs e)
    
{
        filePath 
= Server.MapPath("content.xml");
        doc 
= new XmlDocument();
        doc.Load(filePath);
        
if (!IsPostBack)
        
{
            
if (Application["lock"].ToString() == "unlock")
             
{
                Application[
"lock"= "lock"//锁定防止多用户操作
                int num = GetLastMsgId();
                num
++;
                
string msgid = num.ToString();

                
if (Request.QueryString["userName"!= string.Empty && Request.QueryString["msg"!= string.Empty)
                
{
                    
if (GetMsgNum() < 10)
                    
{
                        
//如果消息少于10条,添加结点
                        AddInLast(msgid, Request.QueryString["userName"].Trim(), Request.QueryString["msg"].Trim());
                    }

                    
else
                    
{
                        
//如果消息少于10条,弹出第一条,再向末结点后添加结点
                        DelFirst();
                        AddInLast(msgid, Request.QueryString[
"userName"].Trim(), Request.QueryString["msg"].Trim());
                    }

                    
                }

                Application[
"lock"= "unlock"//解锁
            }

        }

        doc 
= null;
    }

    
public void DelFirst()
    
{
        
//如果超过10条弹出第一条
        XmlNode node = doc.DocumentElement;
       
        node.RemoveChild(node.FirstChild);
    }

    
public int GetMsgNum()
    
{
        
//Message数目
        XmlNode node = doc.DocumentElement;
        
return node.ChildNodes.Count;
    }

    
public int GetLastMsgId()
    
{
        
//最后一条ID
        XmlNode node = doc.DocumentElement;
        XmlElement last 
= (XmlElement)node.LastChild;
        
return Convert.ToInt32(last.GetAttribute("id"));
    }

    
public void AddInLast(string id,string strUser,string strContent)
    
{
        
//加入新建Messag结点
        XmlNode node = doc.DocumentElement;
        XmlElement msgNode 
= doc.CreateElement("message");
        msgNode.SetAttribute(
"id",id);
        node.AppendChild(msgNode);


        XmlElement eleUser 
= doc.CreateElement("user");
        XmlText textUser 
= doc.CreateTextNode(strUser);
        eleUser.AppendChild(textUser);
        msgNode.AppendChild(eleUser);

        XmlElement eleContent 
= doc.CreateElement("text");
        XmlText textText 
= doc.CreateTextNode(strContent);
        eleContent.AppendChild(textText);
        msgNode.AppendChild(eleContent);

        XmlElement eleTime 
= doc.CreateElement("time");
        XmlText textTime 
= doc.CreateTextNode(DateTime.Now.ToString());
        eleTime.AppendChild(textTime);
        msgNode.AppendChild(eleTime);

        doc.Save(filePath);

    }

}


content.xml结构:
<? xml version="1.0" encoding="utf-8" ?>
< root >

  
< message  id ="125" >
    
< user > test </ user >
    
< text > test </ text >
    
< time > 2006-12-23 16:06:07 </ time >
  
</ message >
</ root >

解决方案:/Files/fancystyle/chat.rar  

 

http://www.cnblogs.com/fancystyle/archive/2006/12/23/601669.html

这篇关于AJAX聊天室小DEMO(讨厌JS,IE下有问题已解决)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/697562

相关文章

Oracle登录时忘记用户名或密码该如何解决

《Oracle登录时忘记用户名或密码该如何解决》:本文主要介绍如何在Oracle12c中忘记用户名和密码时找回或重置用户账户信息,文中通过代码介绍的非常详细,对同样遇到这个问题的同学具有一定的参... 目录一、忘记账户:二、忘记密码:三、详细情况情况 1:1.1. 登录到数据库1.2. 查看当前用户信息1.

springboot3.4和mybatis plus的版本问题的解决

《springboot3.4和mybatisplus的版本问题的解决》本文主要介绍了springboot3.4和mybatisplus的版本问题的解决,主要由于SpringBoot3.4与MyBat... 报错1:spring-boot-starter/3.4.0/spring-boot-starter-

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题

《解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题》在Spring开发中,@Autowired注解常用于实现依赖注入,它可以应用于类的属性、构造器或setter方法上,然... 目录1. 为什么 @Autowired 在属性上被警告?1.1 隐式依赖注入1.2 IDE 的警告:

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

关于Nginx跨域问题及解决方案(CORS)

《关于Nginx跨域问题及解决方案(CORS)》文章主要介绍了跨域资源共享(CORS)机制及其在现代Web开发中的重要性,通过Nginx,可以简单地解决跨域问题,适合新手学习和应用,文章详细讲解了CO... 目录一、概述二、什么是 CORS?三、常见的跨域场景四、Nginx 如何解决 CORS 问题?五、基

python安装whl包并解决依赖关系的实现

《python安装whl包并解决依赖关系的实现》本文主要介绍了python安装whl包并解决依赖关系的实现,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、什么是whl文件?二、我们为什么需要使用whl文件来安装python库?三、我们应该去哪儿下