zoukankan      html  css  js  c++  java
  • js的聊天室组件的封装

    js的聊天室组件的封装

    需求

    1.聊天框,用户名,输入框,发送按钮
    2.用户名,输入框同时有内容,才能成功点击发送
    3.点击发送按钮后,聊天框中添加一条内容
    4.别人发送的消息也能在一定时间内返回到聊天框中

    效果图:

    发送后效果图:

    分析:

    • 点击发送或者回车后调用ajax向服务器发送JSON数据
    • 每隔0.5秒向服务器发送请求,返回数据
    • 获取到数据后,用textArea=,每次返回数据都会覆盖前面的内容,如果这里用+=就会一直累加。

    接口文档

    发送方式 POST
    数据类型 JSON
    地址  http://10.9.65.224:4020
    
    1、主动发消息给服务器
        req 
           {
            type:1
           user:张三
           msg:你好
           }
        res
           [
               {user:张三,msg:你好,time:当前时间},
               {user:张三,msg:你好,time:当前时间},
               {user:张三,msg:你好,time:当前时间},
               {user:张三,msg:你好,time:当前时间},
               {user:张三,msg:你好,time:当前时间},
           ]
    2、主动获取聊天消息
    
       req
          {
              type:2
          }
        res
           [
               {user:张三,msg:你好,time:当前时间},
               {user:张三,msg:你好,time:当前时间},
               {user:张三,msg:你好,time:当前时间},
               {user:张三,msg:你好,time:当前时间},
               {user:张三,msg:你好,time:当前时间},
           ]
    
    

    聊天室组件分装:

    import Utils from "./Utils.js";
    export default class ChatIndex{
        bool;
        ip;
        constructor(_bool,_ip){
            this.bool=_bool;
            this.ip=_ip;
            this.elem=this.creatElem();
            setInterval(e=>this.aniamtion(e),500)
            document.addEventListener("keyup",e=>this.clickHandler(e));
        }
        appendTo(parent){
            if(typeof parent==="string") parent=document.querySelector(parent);
            parent.appendChild(this.elem);
        }
        creatElem(){
            var div=Utils.ce("div",{
                // position:"relative",
            });
            this.textArea=Utils.ce("textarea",{
                resize: "none",
                 "880px",
                height: "400px",
                backgroundColor: "white",
                display:"block",
            })
            this.user=Utils.ce("input",{
                // position:"absolute",
                // left:0,
                // top:"401px",
                float:"left",
                display:"block",
                "120px",
                height: "30px",
                textAlign: "center",
                fontSize: "25px",
                outline: "none",
                verticalAlign: "middle",
            })
            this.user.setAttribute("name","user");
            this.msg=Utils.ce("input",{
                height: "30px",
                textAlign: "left",
                fontSize: "25px",
                outline: "none",
                borderRadius: "30px",
                padding:" 0px 15px",
                 "650px",
                verticalAlign: "middle",
                float:"left",
                display:"block",
            })
            this.msg.setAttribute("name","msg");
            var btn=Utils.ce("button",{
                "70px",
                height: "30px",
                borderRadius: "30px",
                outline: "none",
                float:"left",
                display:"block",
            })
            btn.textContent="发送";
            btn.addEventListener("click",e=>this.clickHandler(e));
            div.appendChild(this.textArea);
            div.appendChild(this.user);
            div.appendChild(this.msg);
            div.appendChild(btn);
            return div;
        }
        clickHandler(e){
            if(e.type==="keyup" && e.keyCode!==13) return;
            if(this.user.value.trim().length===0 || this.msg.value.trim().length===0) return;
            this.ajax({
                type:1,
                user:this.user.value,
                msg:this.msg.value,
                bool:this.bool
            })
            this.msg.value="";
        }
        ajax(data){
            var xhr=new XMLHttpRequest();
            xhr.addEventListener("load",e=>this.loadHandler(e));
            xhr.open("POST",this.ip);
            xhr.send(JSON.stringify(data));
        }
        aniamtion(){
            this.ajax({type:2});
        }
        loadHandler(e){
            if(this.bool)  var str="----";
            else var str="";
            this.textArea.value=JSON.parse(e.currentTarget.response).reduce((value,item)=>{  //不能用+=
                console.log(item);
                value+=item.user+":"+item.msg+str+item.time+"
    ";
                return value;
            },"")
            this.textArea.scrollTop=this.textArea.scrollHeight;
        }
    }
    

    服务器代码

    var http=require("http");
    var arr=[];
    var querystring=require("querystring");
    var server=http.createServer(function(req,res){
       
        var data="";
        req.on("data",function(_data){
            data+=_data;
        })
        req.on("end",function(){
            if(data.trim().length===0) data=req.url.split("?")[1];
            else{
                try{
                    data=JSON.parse(data);
                }catch(error){
    
                }
            }
            if(typeof data==="string"){
                try{
                    data=querystring.parse(data);
                }catch(error){
                    res.end("数据类型错误");
                    return;
                }
            }
            if(!data){
                res.end("数据类型错误");
                return;
            }
            if(data.type===1){
                if(arr.length>500) arr.shift();
                var date=new Date();
                time=date.getHours()+":"+date.getMinutes()+":"+date.getSeconds();
                if(data.bool) arr.push({user:data.user,msg:data.msg,time:time});
                else arr.push({user:data.user,msg:data.msg,time:""});
                console.log(arr);
               
            }
            // console.log(arr);
            res.writeHead(200,{
                "content-type":"text/html;charset=utf-8",
                "Access-Control-Allow-Origin":"*"
            });
            res.write(JSON.stringify(arr));
            res.end();
        })
    })
    server.listen(4003,"10.9.65.224",function(){
        console.log("服务开启")
    })
    

    Utils.js是工具包

    export default class Utils{
       static time=0;
       static ids=0;
       static timeManage={};
    
       static timeStart(){
            if(Utils.time) return;
            Utils.time=new Date().getTime();
        }
       static timeEnd(){
            var t=new Date().getTime()-Utils.time;
            Utils.time=0;
            return t;
        }
        static ts(){
            Utils.ids++;
            Utils.timeManage[Utils.ids]=new Date().getTime();
            return ids;
        }
        static te(id){
            if(!Utils.timeManage[Utils.id]) return 0;
            var t=new Date().getTime()-Utils.timeManage[Utils.id];
            delete Utils.timeManage[Utils.id];
            return t;
        }
        static randomColor(){
            var col="#";
            for(var i=0;i<6;i++){
                col+=Math.floor(Math.random()*16).toString(16);
            }
            return col;
        }
        static random(min,max){
            return Math.floor(Math.random()*(max-min)+min);
        }
         static ce(type,style,parent){
            var elem=document.createElement(type);
            if(style){
                for(var prop in style){
                    elem.style[prop]=style[prop];
                }
            }
            if(typeof parent==="string") parent=document.querySelector(parent);
            if(parent) parent.appendChild(elem);
            return elem;
        }
        static setStyle(styles){
            var style=document.createElement("style");
            document.head.appendChild(style);
            var styleSheet=document.styleSheets[document.styleSheets.length-1];
            for(var prop in styles){
                Utils.addCss(styleSheet,prop,styles[prop]);
            }
        }
        static addCss(styleSheet,selector,style){
            var str=selector+" {";
            for(var prop in style){
                var value=style[prop]
                prop=prop.replace(/([A-Z])/g,function($1){
                    return "-"+$1.toLowerCase();
                })
                str+=prop+":"+value+";"
            }
            str+=" }";
            styleSheet.insertRule(str,styleSheet.cssRules.length);
        }
        static CSStoString(str){
           return str.replace(/(?<=:)(.*?)(?=;)|-[a-z](?=.+:)|;/g,function(item){
                if(item===";") return ","
                if(item[0]==="-")  return item[1].toUpperCase();
                return "'"+item.trim()+"'";
            });
        }
        // TODO 将CSS转换为对象
        static CSStoObject(str){
            str=Utils.CSStoString(str);
           return  str.split(",").reduce((value,item)=>{
               item=item.replace(/
    /g,"");
                var arr=item.split(":");
                arr[0]=arr[0].replace(/s/g,"");
                if(arr[1]===undefined) return value;
                arr[1]=arr[1].replace(/'/g,"");
                value[arr[0]]=arr[1];
                return value;
            },{})
        }
        static getCookie(){
            return document.cookie.split(/;s*/).reduce((value,item)=>{
               var arr=item.split("=");
                value[arr[0]]=isNaN(arr[1]) ? arr[1] : Number(arr[1]);
                return value;
          },{})
        }
        static getCookieValue(key){
           return Utils.getCookie()[key];
        }
        static setCookie(key,value,date){
            if(!date){
                document.cookie=`${key}=${value}`;
                return;
            }
            document.cookie=`${key}=${value};expires=${date.toUTCString()}`;
        }
        static setCookies(obj,date){
            for(var key in obj){
                Utils.setCookie(key,obj[key],date);
            }
        }
        // TODO 删除Cookie
        static removeCookie(key){
            Utils.setCookie(key,"",new Date());
        }
        static clearCookie(){
            for(var key in Utils.getCookie()){
                Utils.removeCookie(key);
            }
        }
    }
    
  • 相关阅读:
    centos7 安装jmeter5.1
    centos7 安装jdk1.8
    es6学习笔记(一)环境搭建
    Django-filter报错:__init__() got an unexpected keyword argument 'name'
    django fields lookup methods(lookup类型)
    django笔记-model
    Git-简单使用
    jenkins-master-slave节点配置总结
    Git-简单使用
    MySQL explain详解
  • 原文地址:https://www.cnblogs.com/94-Lucky/p/13449500.html
Copyright © 2011-2022 走看看