emoji表情pinglun

我网站的评论库一直是使用django-comments库。该评论库对垃圾评论和html处理得都挺不错。但问题是只能写入文字,没有提供富文本编辑功能,需要自己开发。为了丰富评论功能,加入表情是一种不错的方案。

当然,你可以用ueditor等富文本编辑器。

但这些都比较复杂、厚重。评论区域我只想需要简单的效果即可,可以写文字和插入表情。

先看看我最终实现的效果,引起大家的好奇心。


2、emoji表情功能实现方式

这个参考过一些文章,查了不少emoji相关的库或前端插件。例如django-emoji、emojione等。

都只是提供一个emoji表情包和emoji字符文本转换图片表情功能。

我还需要一个东西显示emoji表情选择器,方便用户选择并插入表情。而且保存到数据库的时候还是emoji字符文本或者表情的转义文本。

在Github找到一款jQuery插件:emojioneArea

该插件是利用emojione提供的表情库,制作成一个emoji插件。

该插件有两个版本v2和v3,我比较喜欢v2版本的样式。

Github上提供的是v3。而v2需要通过npm安装:

 
  1. npm install emojionearea@^2.1.3

若觉得安装npm麻烦,可以下载我的demo版本 http://pan.baidu.com/s/1hsr9isO

其中,demo文件夹是官方的demo,包含各种使用方法。

而demo-min文件夹是我的demo文件,只有一个较为精简的例子。


3、在项目中使用emojioneArea

首先引用如下js和css:

 
  1. <script type="text/javascript" src="js/jquery-1.11.3.min.js"></script>
  2.  
  3. <!--emojione v2.1.1 使用bootstrap的cdn-->
  4. <link rel="stylesheet" type="text/css" href="http://cdn.bootcss.com/emojione/2.1.1/assets/sprites/emojione.sprites.css">
  5. <script type="text/javascript" src="http://cdn.bootcss.com/emojione/2.1.1/lib/js/emojione.min.js"></script>
  6.  
  7. <!--emojionearea-->
  8. <link rel="stylesheet" type="text/css" href="css/emojionearea-2.1.3.min.css">
  9. <script type="text/javascript" src="js/emojionearea-2.1.3.min.js"></script>

其中,emojione表情库我使用bootstrap提供的cdn链接。

接着绑定文本框,我原本页面评论框是一个textarea标签,可以直接被emojioneArea绑定。

评论框的id为id_comment,加入如下代码即可:

 
  1. //使用emojioneArea
  2. $("#id_comment").emojioneArea();

默认使用emojioneArea设置,原本的评论框被隐藏。如下效果:

20170323/20170323142640776.png

由于emojioneArea的编辑框失去焦点,就自动返回文本给原本的评论框。

我现在的页面评论提交代码都是基于原本的评论框。

这么一来,我无须做其他修改,就完成了emoji表情功能


4、评论后显示emoji表情图片

评论后不做任何处理的话,会显示emoji表情的文字字符。

20170323/20170323143049578.jpg

需要用emojione插件的表情字符转图片,代码如下:

 
  1. //对评论内容的emoji转化
  2. $(".comment_content p, .reply_content p").each(function(){
  3.     $(this).html(emojione.toImage($(this).text()));
  4. });

该代码是找到评论的内容,遍历每一条评论。

获取其文本,通过emojione.toImage方法转换后的结果是html代码。例如:

 
  1. <img alt="" class="emojione">emoji测试

获取到包含emoji的html代码之后,再赋给该元素即可。


但这段代码有跨站脚本攻击的漏洞。例如有人评论内容为:

 
  1. <script type="text/javascript">alert("hello")</script>

则会被转成html代码执行。修改emoji转化代码如下:

 
  1. //对评论内容的emoji转化
  2. $(".comment_content p, .reply_content p").each(function(){
  3.     var value = $(this).text();
  4.     var code = $('<div/>').text(value).html(); //html转义
  5.     
  6.     $(this).html(emojione.toImage(code));
  7. });

对内容先转义,再处理emoji则不会出现跨站脚本攻击的漏洞。



当然,还需要加个css样式,修改emoji表情的样式。

 
  1. .emojione{
  2.     font-size: inherit;
  3.     height: 2ex;
  4.     width: 2.1ex;
  5.     min-height: 20px;
  6.     min-width: 20px;
  7.     display: inline-block;
  8.     margin: -.2ex .15em .2ex;
  9.     line-height: normal;
  10.     vertical-align: middle;
  11.     max-width: 100%;
  12.     top: 0;
  13. }


效果如下:

20170323/20170323143351326.jpg


最后,点击回复按钮需要跳转到emojioneArea编辑框的位置。可以如下代码定位:

 
  1. $(".emojionearea-editor").focus(); //评论框获得焦点
  2. $("body,html").animate({
  3.         scrollTop: $("#comment_title").offset().top - 90
  4.     }, 100);

comment_title元素是“新的评论”文本。具体元素可以自行设置。

(看完之后,可以评论使用emoji试试 ^_^)

(转载自  杨仕航的博客 !本文链接: http://yshblog.com/blog/144 )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值