原生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>
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持毛票票!