一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

原生js实现回复评论功能的教程

时间:2017-02-04 编辑:简简单单 来源:一聚教程网

实现原理

功能1.删除状态

用removeChild()方法即可

功能2.最上面的点赞

判断文字的内容是否为赞,做相应操作改变存放赞数量的容器文本内容

功能3.回复评论

创建一个新的评论添加到评论列表里

功能4.回复里的点赞

判断我是否点了赞,做相应操作

功能5.回复或者删除

判断字符串回复还是删除,做相应操作

代码用了事件代理,还有三元运算判断,减少代码量

每行代码都有详细的注释

一眼看到那么多的代码不要烦躁

其实你要把每个功能单独去看都是很简单的dom操作

一点点消化,读懂每一行代码

完整代码

注:代码复制到本地后替换下图片

 

 代码如下 复制代码

demo

 

 

  X

  

  

  Andy:哈哈哈哈哈谁还没个妈~//@我的朋友是个呆B: 饮水机那个蕾丝罩我给跪了//@八卦_我实在是太CJ了:仿佛看到了自己家

  

  02-14 23:01

  2980人觉得很赞

  

  

   

   

   老王:我住隔壁我姓王

   02-14 22:00

   23 取消赞

   回复

   

   

  

  

   

   

   我:看哭了留卡号吧

   02-14 24:00

   

   删除

   

   

  

  

  

  评论…

  回复

  0/100

  

  

 

 

  X

  

  

  Andy:哈哈哈哈哈谁还没个妈~//@我的朋友是个呆B: 饮水机那个蕾丝罩我给跪了//@八卦_我实在是太CJ了:仿佛看到了自己家

  

  02-14 23:01

  

  

  

   

   

   我:看哭了留卡号吧

   02-14 24:00

   286 取消赞

   删除

   

   

  

  

  

  评论…

  回复

  0/100

  

  

 

 

 

 //在页面加载完后立即执行多个函数。

 function addloadEvent(func){

  var oldonload=window.onload;

  if(typeof window.onload !="function"){

   window.onload=func;

  }

  else{

   window.onload=function(){

    if(oldonload){

     oldonload();

    }

    func();

   }

  }

 }

 addloadEvent(b);

 function b(){

 var pn=document.getElementById("pn");

 var lists=pn.children;

 //删除当前节点

 function remove(node){

  node.parentNode.removeChild(node);

 }

 //上面的点赞

 function praisebox(box,el){

  //获取赞数量容器

  var praise=box.getElementsByClassName("people")[0];

  //获取容器当前total值

  var total=parseInt(praise.getAttribute("total"));

  //获取点击的innerHTML

  var txt=el.innerHTML;

  //创建一个新的total存储用

  var newtotal;

  //判断点击的文字内容

  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";

 }

 //回复评论

 function reply(box){

  //获取评论框

  var textarea=box.getElementsByTagName("textarea")[0];

  //获取包含所有评论的容器

  var comment=box.getElementsByClassName("comment-list")[0];

  //创建新的评论div

  var div=document.createElement("div");

  //赋类名

  div.className="comment";

  //设置属性

  div.setAttribute("user","self");

  //获取每条评论的innerHTML结构,每次只替换textarea的输入内容和 当前发送时间

  var html=''+''+''+

   ''+

   '我:'+textarea.value+''+

   ''+

   getTime()+

   '赞'+

   '删除'+

   ''+

   '';

  //插入到新建的评论div

  div.innerHTML=html;

  //把新评论插入到评论列表

  comment.appendChild(div);

  //评论后初始化textarea输入框

  textarea.value="评论…";

  textarea.parentNode.className="hf";

 }

 //获取当前时间回复评论时调用

 function getTime(){

  var t=new Date();

  var y=t.getFullYear();

  var m=t.getMonth()+1;

  var d=t.getDate();

  var h=t.getHours();

  var mi=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;

  return y+"-"+m+"-"+d+""+h+":"+mi;

 }

 //回复里点赞

 function praiseReply(el){

  //获取当前total值 也就是所有点赞数量

  vartotal=parseInt(el.getAttribute("total"));

  //获取当前my值 我的点赞

  varmy=parseInt(el.getAttribute("my"));

  //创建新的total

  var newtotal;

  //判断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+" 赞";

  }

 }

 //操作回复

 function operateReply(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[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-btn hf-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='hf hf-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-btn hf-btn-on";

  /*this.style.color="#333"; */ 

  }

  textNub.innerHTML=len+"/100";

  }

 }

 //遍历结束

 }

 

 

热门栏目