document.execCommand
// document.execCommand(命令名称,是否展示用户界面,命令需要的额外参数)
document.execCommand(aCommandName, aShowDefaultUI, aValueArgument)
// 加粗
document.execCommand('bold', false, null);
// 添加图片
document.execCommand('insertImage', false, url || base64);
// 把一段文字用 p 标签包裹起来
document.execCommand('formatblock', false, '<p>');
Selection 对象
用来表示用户选择的范围或光标位置(光标可以看做是范围重合的特殊状态),一个页面用户可能选择多个范围(比如 Firefox)。也就是说 Selection
包含一个或多个 Range
对象(Selection
可以说是 Range
的集合)
// 获取选中的内容信息(getRangeAt 接受一个索引值,因为会有多个 Range,而现在只有一个,所以写0)
let range = window.getSelection().getRangeAt(0)
光标即选取收尾重合的特殊情况
selection 的方法API:
标识符 | |||
---|---|---|---|
特殊字符 | |||
清除样式 | |||
复制样式 | |||
例如 a 变成 A | 小写变大写 | ||
例如 A 变成 a | 大写变小写 | ||
2019-11-07 | 直接插入字符串的时间 | ||
16:02:12 | 直接插入字符串的时间 | ||
撤销和恢复 | |||
zmblank { box-sizing: border-box; display: inline-block; width: 4em; text-align: center; border: 1px solid #000; user-select: none; } |
|||
zmsubline { box-sizing: border-box; display: inline-block; width: 4em; text-align: center; border-bottom: 1px solid #000; } |
不一致带来的问题
原本的样子:<p>√</p>
展示区样式:
p, label {
font-family: "思源黑体 CN Normal","思源黑体 CN Regular","Microsoft YaHei",SourceHanSansCN,Arial,-apple-system,BlinkMacSystemFont,"sans-serif","Helvetica Neue For Number",serif;
line-height: 1.5em;
}
富文本输入区样式:
**
body {
margin: 8px;
font-family: sans-serif;
font-size: 16px;
}
教育行业对字体的选择
React 踩坑
React 中添加 contentEditable 并且有 children 时会报错Warning: A component is
contentEditableand contains
childrenmanaged by React. It is now your responsibility to guarantee that none of those nodes are unexpectedly modified or duplicated. This is probably not intentional.
<div contentEditable children='1113' suppressContentEditableWarning />
解决方案:添加 suppressContentEditableWarning 属性
- 严格控制内容(格式规则检查、内容输入和输出过滤)
- 严格控制光标(劫持、检查、代理)
- 控制撤销重做堆栈
- 为一些关键操作添加生命周期钩子
- 富文本编辑框需要考虑很多XSS的问题,赋值粘贴时标签的过滤等
- 浏览器兼容性的问题,
range
对象操作的不同,contenteditable
属性表现出来的问题 - 统一插入文本的样式,否则输入文字的时候会沿用前面的样式
- @用户高亮显示的浏览器兼容问题
资源
https://github.com/timdown/rangy
https://github.com/jaredreich/pell/blob/master/src/pell.js
contenteditable跟user-modify还能这么玩🌚 - 掘金