小目标
- 使用ts从零实现一个简单的富文本编辑器
- 初步实现“设置标题”,“加粗”,“设置颜色”这几个基本功能
知识准备
contenteditable属性
给任何一个元素加上
contenteditable="true"
便可使其可编辑,由此为基础便可实现一个简单的富文本编辑器了。<div contenteditable="true"></div>
Document.execCommand()
当HTML文档切换到
designMode
时,它的文档对象将公开一个execCommand方法来运行操作当前可编辑区域的命令,如表单输入或可满足元素。document.execCommand(aCommandName, aShowDefaultUI, aValueArgument)
实现过程
初始化项目
"lint": "eslint . --ext .js,.ts", "build": "webpack --env production", "start": "webpack-cli serve"
基于webpack搭建一个基础项目,
yarn start
用于本地开发。yarn build
用于构建生产文件。确定简易富文本编辑器的调用方式
import Editor from '../src/editor'; new Editor('#editor_root', { style: { height: '300px', }, });
初始化编辑器结构
- 实现编辑器菜单
解决
range
丢失的问题当编辑器失去焦点的时候,会导致当前选中的文本丢失。所以在编辑器失去焦点的事件触发时保存当前
range
backupRange(): void { const selection = window.getSelection(); const range = selection.getRangeAt(0); this.currentSelection = { startContainer: range.startContainer, startOffset: range.startOffset, endContainer: range.endContainer, endOffset: range.endOffset, }; }
在执行操作之前,恢复之前的
rangee
restoreRange(): void { if (this.currentSelection) { const selection = window.getSelection(); selection.removeAllRanges(); const range = document.createRange(); range.setStart( this.currentSelection.startContainer, this.currentSelection.startOffset, ); range.setEnd( this.currentSelection.endContainer, this.currentSelection.endOffset, ); // 向选区中添加一个区域 selection.addRange(range); } }
总结
- 简易富文本编辑器的基本功能已实现
webpack
目前尚不支持export library 为es6 module
- 尚未添加单元测试
document.execCommand
已被标记为Obsolete
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。