JavaScript评论点赞功能的实现方法


Posted in Javascript onMarch 13, 2017

通过分析评论功能的逻辑关系,学会如何使用JavaScript实现评论、回复、点赞等各种功能

1.学会JavaScript处理日期和时间。

2.掌握Dom操作中的添加/删除子节点方法。

3.使用setTimeout设置定时器。

4.使用clearTimeout清除定时器以及事件代理的运用。

效果图:

JavaScript评论点赞功能的实现方法

1)实现删除分享内容功能

利用事件代理实现点击关闭按钮删除分享内容。

删除事件:

利用事件代理功能,在父元素节点上添加事件,以减少代码量和系统运行负荷.

事件代理的时候,使用事件对象中的srcElement属性,获取触发元素。

IE浏览器支持window.event.srcElement , 而firefox支持window.event.target。

所以,要想在firefox里面兼容只需要改一个代码:把var el = e.srcElement 改成 var el = e.srcElement || e.target

removeChild()指删除孩子元素,所以要删除当前元素el,先要使用parentNode找到父节点,然后在使用removeChild(el)删除el元素。

var list = document.getElementById('list');
      var boxs = document.getElementsByClassName('box');
      //删除节点函数
      function removeNode(node){
        node.parentNode.removeChild(node);
      }
      //事件代理
      for(var i=0 ;i<boxs.length;i++){
        boxs[i].onclick = function(e){
          e = e||window.event;
          var el = e.srcElement || e.target;
          switch (el.className) {
            case 'close':removeNode(el.parentNode);break;
          }
        }
      }

2)实现分享的点赞功能

 构造一个点赞分享的函数,需要两个参数,第一个参数(box)表示所点赞的最外层父容器,第二个参数(el)指触发的元素,即赞的那个按钮

getAttribute()获得属性,使用setAttribute()来设置元素的属性。

js代码:

//点赞分享
      function praiseBox(box,el){//box为所触发元素el的最外层父容器
        var praiseElement = box.getElementsByClassName('praise-total')[0];
        var oldTotal = parseInt(praiseElement.getAttribute('total'));
        var txt = el.innerHTML;
        var newTotal = 0;
        if(txt == '赞'){
          newTotal = oldTotal + 1;
          praiseElement.innerHTML = (newTotal == 1) ? '我觉得很赞' : '我和' + oldTotal +'个人觉得很赞';
          el.innerHTML = '取消赞';
        }else{
          newTotal = oldTotal - 1;
          praiseElement.innerHTML = (newTotal == 0) ? '' : newTotal + '个人觉得很赞';
          el.innerHTML = '赞';
        }
        praiseElement.setAttribute('total',newTotal);
        praiseElement.style.display = (newTotal == 0) ? 'none': 'block';
      }
      //事件代理
      for(var i=0 ;i<boxs.length;i++){
        boxs[i].onclick = function(e){
          e = e||window.event;
          var el = e.srcElement || e.target;
          switch (el.className) {
            case 'close':removeNode(el.parentNode);break;
            case 'praise':praiseBox(el.parentNode.parentNode.parentNode,el);
          }
        }
      }

3)实现评论功能

首先要实现评论输入框的改变,通过监听三个事件

1.获得焦点时:onfocus

2.失去焦点:onblur

3.鼠标输入弹起来的时候:onkeyup

//输入框
        var textarea = boxs[i].getElementsByTagName('textarea')[0];
        textarea.onfocus = function(){
          this.parentNode.className = 'text-box text-box-on';
          this.value = (this.value == '评论...') ? '':this.value;
        }
        textarea.onblur = function(){
          if(this.value == ''){
            this.parentNode.className = 'text-box';
            this.value = '评论...';
          }
        }

4)实现回复按钮和字数统计功能

对textarea添加onkeyup键盘弹起事件,学会利用获取父节点和孩子节点的方法。

为了更好的用户体验,使输入框失去焦点时不是立即变小,所以在onblur中增加一个定时器功能,注意当点击灰色回复按钮时要清除定时器

js代码:

textarea.onblur = function(){
          var me = this;//因为有定时器所以先将this存放于变量中
          timer = setTimeout(function(){
            if(me.value == ''){
              me.parentNode.className = 'text-box';
              me.value = '评论...';
            }
          },500);
        }
        textarea.onkeyup = function(){
          var len = this.value.length;
          var p = this.parentNode;
          var btn = p.children[1];
          var word = p.children[2];
          if(len == 0 || len > 140){
            btn.className = 'btn btn-off';
          }else{
            btn.className = 'btn';
          }
          word.innerHTML = len + '/140';
        }

 5)实现评论分享功能

当点击回复按钮时,将输入框的内容添加到回复列表中,是通过创建一个div,新增一个回复列表,注意改变新增回复列表的部分内容以及要改变评论的日期。

js代码:

//发表评论
      function replayBox(box){
        var textarea = box.getElementsByTagName('textarea')[0];
        var list = box.getElementsByClassName('comment-list')[0];
        var div = document.createElement('div');
        div.className = 'comment-box clearfix';
        div.setAttribute('user','self');
        var html = ' <img src="images/my.jpg" class="myhead" alt="" />'+
            '<div class="comment-content">'+
            '<p class="comment-text"><span class="user">我:</span>'+textarea.value+'</p>'+
            '<p class="comment-time">'+
            getTime()+
            '<a href="javascript:;" rel="external nofollow" rel="external nofollow" class="comment-praise" total="0" my="0" style="">赞</a>'+
            '<a href="javascript:;" rel="external nofollow" rel="external nofollow" class="comment-operate">删除</a>'+
            '</p>'+
            '</div>';
        div.innerHTML = html;
        list.appendChild(div);
        textarea.value = '';
        textarea.onblur();
        function getTime(){
          var t = new Date();
          var y = t.getFullYear();
          var m = t.getMonth() + 1;//月份是从0开始
          var d = t.getDay();
          var h = t.getHours();
          var mi = t.getMinutes();
          m = m>10 ? m: '0' + m;
          d = d>10 ? d: '0' + d;
          h = h>10 ? h: '0' + h;
          mi = mi>10 ?mi: '0' +mi;
          return y + '-' + m + '-' + d + ' ' + h + ':' + mi;
        }
      }

5)实现点赞回复功能

点赞按钮的a标签中有个my属性,表示自己是否已点赞,当my值为0时,点击赞按钮时total会加一,当my值为1时,点击赞按钮时total减1。

js代码:

//点赞回复
      function praiseReplay(el){
        var oldTotal = parseInt(el.getAttribute('total'));
        var my = parseInt(el.getAttribute('my'));
        var newTotal = 0;
        if(my == 0){
          newTotal = oldTotal + 1;
          el.setAttribute('total',newTotal);
          el.setAttribute('my',1);
          el.innerHTML = newTotal + '取消赞';
        }else{
          newTotal = oldTotal - 1;
          el.setAttribute('total',newTotal);
          el.setAttribute('my',0);
          el.innerHTML = (newTotal == 0) ? '' : newTotal + '赞';
        }
        el.style.display = (newTotal == 0) ? '' : 'inline-block';
      }

 6)实现回复列表中内容的删除和回复功能

实现回复他人的评论及删除自己的评论

 js代码:

//操作回复
      function operateReply(el){
        var commentBox = el.parentNode.parentNode.parentNode;//评论的容器
        var box = commentBox.parentNode.parentNode.parentNode;//该条分享的容器
        var textarea = box.getElementsByTagName('textarea')[0];
        var user = commentBox.getElementsByClassName('user')[0];
        var txt = el.innerHTML;
        if(txt == '回复'){
          textarea.onfocus();
          textarea.value = '回复' + user.innerHTML;
          textarea.onkeyup();
        }
        else{
          removeNode(el.parentNode.parentNode.parentNode);
        }
      }

以上所述是小编给大家介绍的JavaScript评论点赞功能的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
从零学jquery之如何使用回调函数
May 16 Javascript
现代 JavaScript 开发编程风格Idiomatic.js指南中文版
May 28 Javascript
JQuery中模拟image的ajaxPrefilter与ajaxTransport处理
Jun 19 Javascript
javascript动态添加checkbox复选框的方法
Dec 23 Javascript
全面解析bootstrap格子布局
May 22 Javascript
js实现小窗口拖拽效果
Dec 03 Javascript
jQuery Validate验证框架详解(推荐)
Dec 17 Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
Feb 21 Javascript
浅谈如何使用 webpack 优化资源
Oct 20 Javascript
微信小程序实现点击按钮修改view标签背景颜色功能示例【附demo源码下载】
Dec 06 Javascript
利用angular、react和vue实现相同的面试题组件
Feb 19 Javascript
使用Vuex实现一个笔记应用的方法
Mar 13 Javascript
JS+html5 canvas实现的简单绘制折线图效果示例
Mar 13 #Javascript
JS实现含有中文字符串的友好截取功能分析
Mar 13 #Javascript
JS实现直接运行html代码的方法
Mar 13 #Javascript
js从输入框读取内容,比较两个数字的大小方法
Mar 13 #Javascript
jsonp跨域请求实现示例
Mar 13 #Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
Mar 13 #Javascript
H5实现中奖记录逐行滚动切换效果
Mar 13 #Javascript
You might like
php 获取mysql数据库信息代码
2009/03/12 PHP
PHP 组件化编程技巧
2009/06/06 PHP
Function eregi is deprecated (解决方法)
2013/06/21 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
thinkPHP通用控制器实现方法示例
2017/11/23 PHP
javascript时间函数基础介绍
2013/03/28 Javascript
jQuery 遍历- 关于closest() 的方法介绍以及与parents()的方法区别分析
2013/04/26 Javascript
jquery特效 幻灯片效果示例代码
2013/07/16 Javascript
目前流行的JavaScript库的介绍及对比
2013/09/29 Javascript
JS限制文本框只能输入数字和字母方法
2015/02/28 Javascript
JS给Textarea文本框添加行号的方法
2015/08/20 Javascript
javascript实现全角转半角的方法
2016/01/23 Javascript
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
2016/02/23 Javascript
AngularJS 实现JavaScript 动画效果详解
2016/09/08 Javascript
js基础之DOM中document对象的常用属性方法详解
2016/10/28 Javascript
JavaScript设置名字输入不合法的实现方法
2017/05/23 Javascript
vuejs事件中心管理组件间的通信详解
2017/08/09 Javascript
node.js基于fs模块对系统文件及目录进行读写操作的方法详解
2017/11/10 Javascript
微信小程序实现图片上传、删除和预览功能的方法
2017/12/18 Javascript
vue使用iframe嵌入网页的示例代码
2020/06/09 Javascript
小程序识别身份证,银行卡,营业执照,驾照的实现
2019/11/05 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
python 计算两个日期相差多少个月实例代码
2017/05/24 Python
Python selenium实现微博自动登录的示例代码
2018/05/16 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
2019/08/20 Python
Django框架下静态模板的继承操作示例
2019/11/08 Python
Python3 Tkinkter + SQLite实现登录和注册界面
2019/11/19 Python
浅谈tensorflow 中的图片读取和裁剪方式
2020/06/30 Python
Keras保存模型并载入模型继续训练的实现
2021/02/20 Python
英文自我鉴定
2013/12/10 职场文书
领导证婚人证婚词
2014/01/13 职场文书
简历里的自我评价
2014/01/31 职场文书
手术室护士长竞聘书
2014/03/31 职场文书
表彰大会策划方案
2014/05/13 职场文书
当你找不到方向的时候,不妨读读刘备的一生
2019/08/05 职场文书
sql时间段切分实现每隔x分钟出一份高速门架车流量
2022/02/28 SQL Server