所谓的富文本编辑器就是内嵌在浏览器上、所见即所得的文本编辑器,它的形式如下:
富文本编辑器形式

layui框架中内置了layedit模块,该模块就是富文本编辑器模块,在最近两天中我自己使用原生js实现了简易的富文本编辑器,具体效果如下:
原生js编码的富文本编辑器

首先说说这个demo的组织结构:
ueditor组织结构

在这个demo中,整体是一个IIFE,使用window对象将其构造函数暴露出去,想要使用这个demo,需要创建一个容器设置id属性为ueditor,其实demo需要做的几个关键点如下

  • 构建文本编辑器的主体html结构
  • 绑定工具栏的每个工具的事件绑定
  • 如何获取选择的文本
  • 如何给选择的文本应用样式
  • 如何插入图片

对于1和2这两个问题就是动态创建节点并追加到指定元素下,并使用addEventListener(就不考虑IE了)来绑定事件。

下面就来说说我对于下面3个关键点的处理:

  • 获取文本,先来说说获取文本的动作,鼠标按下、拖动、松开、点击具体工具的过程,所以我对于内容区绑定mouseout事件。
    当选择文本后离开目标点时触发事件处理程序,使用window.getSelection()方法来获取被选择区域对象获取其文本,该方法存在兼容问题,感兴趣的同学可以具体看看。
  • 如何给选择的文本应用样式:
    我的做法是添加标签添加指定class类来实现,对于对齐的样式,需要改变包含文本的元素为块状元素,应用text-align样式
  • 如何插入图片:
    实际上还是添加img标签,获取点击的表情的src属性值,添加到内容区

实现过程中的问题:

  • 刚开始打算使用textarea来作为内容区的,但是有一个问题就是插入的html标签不被识别,只能是文本,所以就使用div+contentEditable来实现

该demo的问题:

  • 体验性不好,整体操作给人感觉不自然不流畅
  • 样式没有好好设计,弹出效果生硬,没有应用动画效果
  • 文本选择的时候,感觉不自然
  • 应用样式重复问题,没有做处理优化

富文本编辑器demo的实现差强人意吧,以后会将其作为独立项目重新编写。

下面就分析下layui框架中富文本编辑器模块,该内置模块的组织结构图如下所示:
layedit组织结构图

从上图中可见,作者将创建文本编辑器的方法作为api暴露了出来,在使用过程中需要手动调用来实现文本编辑器的创建工作。

关于该内置模块具体的运行逻辑如下图所示:
逻辑图

在分析了该内置模块的源码过程中,作者实现文本样式的应用是通过document.execCommand():方法来实现的,该方法的功能就是用于操作可编辑区域的文本,可以对于改变文本大小字体等,实际上该方法也是添加标签来实现,但是对于重复性标签做了处理。当然该内置模块还提供了其他的功能,我会对其源码做详细的注释,具体可以查看我的GitHub,最近项目开始启动,实践与分析源码的时间会少许多,但是会一直实践并坚持分析该框架的内置模块。

致远行的你我
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐