原生js实现回复评论功能
实现原理
功能1.删除状态
用removeChild()方法即可
功能2.最上面的点赞
判断文字的内容是否为赞,做相应操作改变存放赞数量的容器文本内容
功能3.回复评论
创建一个新的评论添加到评论列表里
功能4.回复里的点赞
判断我是否点了赞,做相应操作
功能5.回复或者删除
判断字符串回复还是删除,做相应操作
代码用了事件代理,还有三元运算判断,减少代码量
每行代码都有详细的注释
一眼看到那么多的代码不要烦躁
其实你要把每个功能单独去看都是很简单的dom操作
一点点消化,读懂每一行代码
完整代码
注:代码复制到本地后替换下图片
<!DOCTYPEhtml> <htmllang="en"> <head> <metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/> <title>demo</title> <style> body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fieldset,legend,button,input,textarea,th,td{margin:0;padding:0;border:none;outline:none;} h1,h2,h3,h4,h5,h6{font-size:100%;} address,cite,dfn,em,var{font-style:normal;} code,kbd,pre,samp{font-family:couriernew,courier,monospace;} ul,ol{list-style:none;} a{text-decoration:none;} a:hover,a:visited,a:link,a:active{text-decoration:none;} sup{vertical-align:text-top;} sub{vertical-align:text-bottom;} legend{color:#000;} fieldset,img{border:0;} button,input,select,textarea{font-size:100%;} table{border-collapse:collapse;border-spacing:0;} .clear{clear:both;float:none;height:0;overflow:hidden;} body{color:#333;font:12px/1.3'Arial','MicrosoftYaHei';} #pn{width:550px;height:auto;background:#fff;margin:0auto;padding:20px;} .list0{padding:20px0;position:relative;border-top:1pxsolid#eee;} .head{width:60px;float:left;} .headimg{width:60px;height:60px;} .close{width:20px;height:20px;position:absolute;top:0;right:0;color:#696e78;font-size:14px;text-align:center;line-height:20px;} .close:hover{color:#eb7350;} .content{width:450px;line-height:20px;font-size:14px;margin-left:70px;} .name{color:#eb7350;} .pic{margin:5px0;} .good:after{clear:both;content:'';display:block;width:0;height:0;visibility:hidden;} .good{*zoom:1;} .date{float:left;color:#808080;} .gooda{float:right;color:#808080;} .people{background:#F7F7F7;height:28px;line-height:28px;padding-left:10px;margin:5px0;} .comment:after{clear:both;content:'';display:block;width:0;height:0;visibility:hidden;} .comment{*zoom:1;padding:10px0;border-top:1pxsolid#eee;} .comment-left{width:30px;float:left;display:inline;margin-right:10px;} .comment-leftimg{width:30px;height:30px;} .comment-right{float:left;width:410px;} .comment-text{line-height:18px;} .comment-textspan{color:#eb7350;} .comment-date{font-size:12px;line-height:14px;color:#ccc;position:relative;} .comment-zan{position:absolute;right:40px;bottom:0;color:#808080;} .comment-dele{position:absolute;right:0;bottom:0;color:#808080;} .hf:after{clear:both;content:'';display:block;width:0;height:0;visibility:hidden;} .hf{*zoom:1;} .hf-text{border:1pxsolid#eee;display:block;height:15px;width:438px;padding:5px;resize:none;color:#ccc;font-size:12px;} .hf-on.hf-text{height:60px;color:#333;border:1pxsolid#ff8140;} .hf-btn{float:right;width:65px;height:26px;background:#f7f7f7;color:#ccc;font-size:12px;display:none;} .hf-btn-on{background:#ff8140;color:#fff;} .hf-nub{float:right;padding:3px5px;color:#666;display:none;} .hf-on.hf-btn{display:inline;} .hf-on.hf-nub{display:inline;} </style> </head> <body> <ulid="pn"> <liclass="list0"> <aclass="close"href="javascript:;">X</a> <divclass="head"><imgsrc="images/T1.jpg"alt=""/></div> <divclass="content"> <pclass="text"><spanclass="name">Andy:</span>哈哈哈哈哈谁还没个妈~//@我的朋友是个呆B:饮水机那个蕾丝罩我给跪了//@八卦_我实在是太CJ了:仿佛看到了自己家</p> <divclass="pic"><imgsrc="images/img1.jpg"alt=""/></div> <divclass="good"><spanclass="date">02-1423:01</span><aclass="dzan"href="javascript:;">赞</a></div> <divclass="people"total="2980">2980人觉得很赞</div> <divclass="comment-list"> <divclass="comment"user="self"> <divclass="comment-left"><imgsrc="images/T1.jpg"alt=""/></div> <divclass="comment-right"> <divclass="comment-text"><spanclass="user">老王:</span>我住隔壁我姓王</div> <divclass="comment-date">02-1422:00 <aclass="comment-zan"href="javascript:;"total="23"my="1">23取消赞</a> <aclass="comment-dele"href="javascript:;">回复</a> </div> </div> </div> <divclass="comment"user="self"> <divclass="comment-left"><imgsrc="images/T1.jpg"alt=""/></div> <divclass="comment-right"> <divclass="comment-text"><spanclass="user">我:</span>看哭了留卡号吧</div> <divclass="comment-date">02-1424:00 <aclass="comment-zan"href="javascript:;"total="0"my="0">赞</a> <aclass="comment-dele"href="javascript:;">删除</a> </div> </div> </div> </div> <divclass="hf"> <textareatype="text"class="hf-text"autocomplete="off"maxlength="100">评论…</textarea> <buttonclass="hf-btn">回复</button> <spanclass="hf-nub">0/100</span> </div> </div> </li> <liclass="list0"> <aclass="close"href="javascript:;">X</a> <divclass="head"><imgsrc="images/T2.jpg"alt=""/></div> <divclass="content"> <pclass="text"><spanclass="name">Andy:</span>哈哈哈哈哈谁还没个妈~//@我的朋友是个呆B:饮水机那个蕾丝罩我给跪了//@八卦_我实在是太CJ了:仿佛看到了自己家</p> <divclass="pic"><imgsrc="images/img1.jpg"alt=""/></div> <divclass="good"><spanclass="date">02-1423:01</span><aclass="dzan"href="javascript:;">赞</a></div> <divclass="people"total="0"style="display:none;"></div> <divclass="comment-list"> <divclass="comment"user="self"> <divclass="comment-left"><imgsrc="images/T2.jpg"alt=""/></div> <divclass="comment-right"> <divclass="comment-text"><spanclass="user">我:</span>看哭了留卡号吧</div> <divclass="comment-date">02-1424:00 <aclass="comment-zan"href="javascript:;"total="286"my="1">286取消赞</a> <aclass="comment-dele"href="javascript:;">删除</a> </div> </div> </div> </div> <divclass="hf"> <textareatype="text"class="hf-text"autocomplete="off"maxlength="100">评论…</textarea> <buttonclass="hf-btn">回复</button> <spanclass="hf-nub">0/100</span> </div> </div> </li> </ul> <scripttype="text/javascript"> //在页面加载完后立即执行多个函数。 functionaddloadEvent(func){ varoldonload=window.onload; if(typeofwindow.onload!="function"){ window.onload=func; } else{ window.onload=function(){ if(oldonload){ oldonload(); } func(); } } } addloadEvent(b); functionb(){ varpn=document.getElementById("pn"); varlists=pn.children; //删除当前节点 functionremove(node){ node.parentNode.removeChild(node); } //上面的点赞 functionpraisebox(box,el){ //获取赞数量容器 varpraise=box.getElementsByClassName("people")[0]; //获取容器当前total值 vartotal=parseInt(praise.getAttribute("total")); //获取点击的innerHTML vartxt=el.innerHTML; //创建一个新的total存储用 varnewtotal; //判断点击的文字内容 if(txt=="赞"){ //total值+1因为我还没点击赞,所以要点击的时候就多了一个人total+1 newtotal=total+1; //判断赞数量把相应文字放到赞容器里 praise.innerHTML=newtotal==1?"我觉得很赞":"我和"+total+"个人觉得很赞"; el.innerHTML="取消赞"; } else{ //反之total值-1 newtotal=total-1; praise.innerHTML=newtotal==0?"":newtotal+"个人觉得很赞"; el.innerHTML="赞"; } //更新total值 praise.setAttribute("total",newtotal); //如果没有人点赞容器隐藏 praise.style.display=(newtotal==0)?"none":"block"; } //回复评论 functionreply(box){ //获取评论框 vartextarea=box.getElementsByTagName("textarea")[0]; //获取包含所有评论的容器 varcomment=box.getElementsByClassName("comment-list")[0]; //创建新的评论div vardiv=document.createElement("div"); //赋类名 div.className="comment"; //设置属性 div.setAttribute("user","self"); //获取每条评论的innerHTML结构,每次只替换textarea的输入内容和当前发送时间 varhtml='<divclass="comment-left">'+'<imgsrc="images/T2.jpg"alt=""/>'+'</div>'+ '<divclass="comment-right">'+ '<divclass="comment-text"><span>我:</span>'+textarea.value+'</div>'+ '<divclass="comment-date">'+ getTime()+ '<aclass="comment-zan"href="javascript:;"total="0"my="0">赞</a>'+ '<aclass="comment-dele"href="javascript:;">删除</a>'+ '</div>'+ '</div>'; //插入到新建的评论div div.innerHTML=html; //把新评论插入到评论列表 comment.appendChild(div); //评论后初始化textarea输入框 textarea.value="评论…"; textarea.parentNode.className="hf"; } //获取当前时间回复评论时调用 functiongetTime(){ vart=newDate(); vary=t.getFullYear(); varm=t.getMonth()+1; vard=t.getDate(); varh=t.getHours(); varmi=t.getMinutes(); m=m<10?"0"+m:m; d=d<10?"0"+d:d; h=h<10?"0"+h:h; mi=mi<10?"0"+mi:mi; returny+"-"+m+"-"+d+""+h+":"+mi; } //回复里点赞 functionpraiseReply(el){ //获取当前total值也就是所有点赞数量 vartotal=parseInt(el.getAttribute("total")); //获取当前my值我的点赞 varmy=parseInt(el.getAttribute("my")); //创建新的total varnewtotal; //判断my=0就是我准备要点赞 if(my==0){ //我点了赞总数量就要+1 newtotal=total+1; //更新total值 el.setAttribute("total",newtotal); //更新my值 el.setAttribute("my",1); //更新文字就是我点了后文字就是取消赞了 el.innerHTML=newtotal+"取消赞"; }else{ //反之-1 newtotal=total-1; el.setAttribute("total",newtotal); el.setAttribute("my",0); el.innerHTML=(newtotal==0)?"赞":newtotal+"赞"; } } //操作回复 functionoperateReply(el){ //每条评论 varcomment=el.parentNode.parentNode.parentNode; //整个状态 varbox=comment.parentNode.parentNode.parentNode; //评论框 vartextarea=box.getElementsByTagName("textarea")[0]; //名字 varuser=comment.getElementsByClassName("user")[0]; //点击的innerHTML vartxt=el.innerHTML; //判断当前点击的是否为回复 if(txt=="回复"){ //评论框触发焦点事件也就是变高 textarea.onfocus(); //内容变为回复+当前人的名字 textarea.value="回复"+user.innerHTML; //调用键盘事件 textarea.onkeyup(); }else{ //否则就是删除节点 remove(comment); } } //遍历所有状态消息 for(vari=0;i<lists.length;i++){ //全部事件代理 lists[i].onclick=function(e){ //获取当前点击事件 vare=e||window.event; varel=e.srcElement; if(!el){ el=e.target;//兼容火狐 } //判断点击的类名 switch(el.className){ //关闭整个状态 case"close": remove(el.parentNode); break; //上面的点赞 case"dzan": praisebox(el.parentNode.parentNode.parentNode,el); break; //回复评论 case"hf-btnhf-btn-on": reply(el.parentNode.parentNode.parentNode); break; //每条评论中点赞 case"comment-zan": praiseReply(el); break; case"comment-dele": operateReply(el); break; } } vartextarea=lists[i].getElementsByClassName("hf-text")[0]; //焦点事件 textarea.onfocus=function(){ this.parentNode.className='hfhf-on'; this.value=this.value=='评论…'?'':this.value; } //失焦事件 textarea.onblur=function(){ if(this.value==''){ this.parentNode.className='hf'; this.value='评论…'; } } //键盘事件 textarea.onkeyup=function(){ varlen=this.value.length; vartextParentNode=this.parentNode; vartextBtn=textParentNode.children[1]; vartextNub=textParentNode.children[2]; if(len==0/*||len>100*/){ textBtn.className="hf-btn"; }else{ textBtn.className="hf-btnhf-btn-on"; /*this.style.color="#333";*/ } textNub.innerHTML=len+"/100"; } } //遍历结束 } </script> </body> </html>
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持毛票票!