因为项目需求,前台做一个聊天编辑器。

由于需要插入表情,而非纯文本,textarea显然是不能支持。这种需求的。这种需求就我所知只能用div 来实现。

一个div元素,要让其可编辑,也就是可读写,contenteditable属性是最常用方法,做前端的基本上都知道,原理就是在这个div 添加html。模拟展示。输入框。

项目需求大概是这样的

遇到的坑:

然而,这个属性,除去兼容性不说,还是存在一些比较坑爹的小bug的。搜了不少文章,比如张鑫旭大神的纯文本方式输出div内容,链接狂戳以下,帮助还是很大的:

http://www.zhangxinxu.com/wordpress/2016/01/contenteditable-plaintext-only/

但是在真正使用的时候,发现了一个很大很大的坑。一般的编辑器,都需要事实字数统计功能。在测试纯文本contenteditable时发现了如下几个坑人的问题:

1、 换行时,字数+2,再次输入一个字符,字数不变,然后再逐渐+1。(字数统计方式当然是获取html然后计算length)。

有的浏览器换行会加P元素,有的会加<div><br><div>,我遇到的就是这个,还是先加两个,然后才逐渐加1个。和上述一样。(ps:这种问题用shift+enter 是可以避免 直接加<br>的,但是显然这个不能解决根本问题,因为人的习惯就是enter换行,一但按enter后,你输入的文字,将在<div><br><div>下。个人感觉后续很难处理。)

2、 在末尾换行的时候,会加出一个看不见br。按回车br出现但页面没换行,在按一次会在加一个br,行是换了。但是末尾这                个换行是存在2个br的。那个末尾多出的br.(死活干不掉,选了也选不着。注:别在末尾换行,可以避免这个坑。当然                  了,用户是不可能不踩这个坑的,随便打个字,在那个字前面换行。编辑结束在删掉即可。)

3、无法再光标处插入新加文字或者表情img标签。

4、 删除字符后,在dom里会留下一堆双引号。(这个我不打算理会,因为输出的字符串是没有这些家伙的。)

网上查看了一下,没什么可用信息。于是自己想了一套方案处理这些坑。

方案:

主要方法。解决第三个坑的主要问题。在光标处插入表情的img标签

 /*光标处插入html代码,参数是String类型的html代码,例子:"<p>猪头诺</p>"*/function insertHtml(html) {var sel, range;if (window.getSelection) {// IE9 或 非IE浏览器sel = window.getSelection();if (sel.getRangeAt && sel.rangeCount) {range = sel.getRangeAt(0);range.deleteContents();// Range.createContextualFragment() would be useful here but is// non-standard and not supported in all browsers (IE9, for one)var el = document.createElement("div");el.innerHTML = html;var frag = document.createDocumentFragment(),node, lastNode;while ((node = el.firstChild)) {lastNode = frag.appendChild(node);}range.insertNode(frag);// Preserve the selectionif (lastNode) {range = range.cloneRange();range.setStartAfter(lastNode);range.collapse(true);sel.removeAllRanges();sel.addRange(range);}}} else if (document.selection && document.selection.type != "Control") {// IE < 9document.selection.createRange().pasteHTML(html);}}

先介绍这个方法,是解决坑1也需要这个方法。

现在我将用他来解决坑1.

我的解决思路是,阻止回车事件。然后由自己写的逻辑来走。就是我让它回车加<br>就可以了。将它写在阻止事件中。

阻止事件。代码如下

    /*阻止回车事件*/$(window).keydown( function(e) {var key = window.event?e.keyCode:e.which;/*获取用户按键,如果是回车,则不执行任何*/if(key.toString() == "13"){/*调用光标插入方法,在光标处插入 换行*/insertHtml("<br>");return false;}});

如此一来就把坑1 给填了。回车之后只有<br>,而不会出现其他的标签了。

现在我们来解决坑2.末尾换行会多一个br。死活删不掉的一个<br>。不看代码是看不到的。但是是存在的。
我的解决思路是。这个家伙占据这个div输出框4个字节。我可以监听这个div内容。当它的length为4的时候,判断其html。如果为<br>则清空这个<div>。这个是解决删除全部文本。删不掉。它是在末尾,提交的时候可以获取br个数。干掉最后一个即可。不过末尾有个br,其实影响,个人感觉不大。所以我苦恼的是删除时候它占据了在内容里面

监听方法如下:

         /** 输入框监听事件* */$('.js_edit_area').bind('input propertychange', function() {var  len =$(this).html().length;var  x = 600-len;/*限制只能输入600字*/if(x<=600){}/*判断长度,干掉多余的br*/if(len==4){var br = $('.js_edit_area').html();if(br=="<br>"){$('.js_edit_area').html("");$(".js_editor_tip em").html("600");}}/*也可以获取br元素,干掉最后一个br即可,逻辑写在提交那里*/});

以上是个人的一些解决方案。记录成长,也分享帮助需要的你们。

前端之路:contenteditable 换行踩坑心得相关推荐

  1. contenteditable换行踩坑心得

    做后台编辑器,可伸缩下性的输入框,在H5出了contenteditable之后,基本取代了使用textarea自适应高度的方式. 然而,这个属性,除去兼容性不说,还是存在一些比较坑爹的小bug的.搜了 ...

  2. 微信支付『支付失败,如果已扣款,资金在0-3个工作日原路返回』踩坑案例及解决方案

    微信支付『支付失败,如果已扣款,资金在0-3个工作日原路返回』踩坑案例及解决方案 参考文章: (1)微信支付『支付失败,如果已扣款,资金在0-3个工作日原路返回』踩坑案例及解决方案 (2)https: ...

  3. 数字货币搬砖之路(第一次踩坑)

    最近一直在研究数字货币量化策略,继多平台对冲套利,网格高频交易策略开发完之后, 想起多年前前人屡试不爽的手动搬砖策略,不知道在当前行情还能不能行的通,于是写了程序测试下. 然后,我想说的是----&q ...

  4. Hbase安装流程及踩坑心得

    关于安装zookeeper和hbase 前言 网上已经有相当多的zookeeper和hbase的安装教程了.那为什么总是在安装的时候,还是可以遇到那么多问题. 有话说 搭建一个自己的大数据平台,手把手 ...

  5. 前端用sql 还是mysql_前端小白安装MySQL的踩坑路

    1.首先进入官网下载MySQL 然鹅当我进入官网,是这样的!这是看不起我大学英语六级水平么,这个下载也太奇怪了.点进去也找不到在哪里.(可能是我太傻,勿喷哈) 最后我找到了这个下载链接,奶思开始下载! ...

  6. 2017年前端工作小结,个人踩坑之旅,前端学习者的杂谈

    工作差1月就要满一年了,这一年中水平并没有直接性的提升,以至于初学前端时无法探究的诸多问题,依旧没有头绪,但工作就是的一次次跳坑和爬坑,它终究是带给了我一些... 关于工作,在一家创业公司(没人带-_ ...

  7. 当我尝试写一个自动写小说的AI,长路漫漫的踩坑之路 ToT

    起因 事情是这样的,前几天我在刷B站的时候看到一个大佬用训练了一个自动写高考作文的AI 链接: https://www.bilibili.com/video/BV1pr4y1w7uM 那我就想既然别人 ...

  8. 前端之路:html2canvas脱坑,(图片模糊,多次加载,图片跨域)

    有女票的程序员真的颓废,都不记得多久没写心路历程了(T T). 插件简介: 1.官网:http://html2canvas.hertzen.com/ 2.GitHub:https://github.c ...

  9. 【vue-router①】router-link跳转页面传递参数 - 进击的前端之路(偶尔爬坑java小路) - SegmentFault 思否

    在vue项目中,往往会遇到这样的情况,就是要实现在一个循环列表中,点击其中一条跳转到下个页面,然后将这一条的相关数据带到下个页面中显示,这是个循环列表,无论点哪一条都是跳到相同的页面,只是填的数据不一 ...

最新文章

  1. video怎么重新加载 vue_vue.js中vue-video-player中的怎么插入多个视频,视频可以同时播放的问题及解决办法...
  2. 安装JDK时提示 IllegalArgumentException:Invalid characters in hostname的解决方法
  3. DCMTK:DcmDecimalString类的测试程序
  4. C语言堆排序Heap Sort算法(附完整源码)
  5. shell (check return of each line)(PIPESTATUS[@])and sudoer
  6. 前端框架——bootstrap/knockoutjs/angularjs
  7. Nginx(1)— Nginx工作原理
  8. WMB Commands
  9. 关于“墨者安全专家3.7”不得不说的事情
  10. 《Google工作整理术》读后感
  11. 关于异业联盟和O2O商业模式的一些想法
  12. educoder——面向对象程序设计java——实验实训——实验三 - 集合框架
  13. 【EXCEL分列小技巧:按特殊符号分列】
  14. 智能体的奇幻漂流之“成都折叠”篇
  15. 软考-高级-信息系统项目管理师
  16. asp.net毕业生信息管理系统VS开发sqlserver数据库web结构c#编程计算机网页源码项目
  17. python发送esc_使用win32prin将一行文本发送到Python中的ESC/POS打印机
  18. 三年级计算机画图工具教案,小学三年级信息技术教学设计《画图》
  19. MATLAB控制系统仿真与CAD
  20. Unity抽奖转盘制作代码

热门文章

  1. 一个月拿到阿里字节拼多多美团offer总结
  2. ubuntu 下关闭触摸板
  3. 高人气直播间必备的8个直播留人技巧
  4. 快递收发软件移动端上线啦!易上手好操作,轻松提高企业快递管理效率
  5. 文明6游戏 linux,《文明6》正式支持Linux/SteamOS 但不支持Intel核显和A卡
  6. linux 如何让.开头的文件不隐藏_linux系统不为人知的文件与目录的隐藏权限
  7. PTA 7-14 统计英文单词个数
  8. Hadoop学习系列之Hadoop、Spark学习路线(很值得推荐)
  9. Java罗马数字判断
  10. PD1.4转HDMI2.0转接线拆解。