Medium为什么editable是泰瑞宝
https://medium.engineering/why-contenteditable-is-terrible-122d8a40e480
要点:
- 树形文档结构是狗屎, 顺序结构才是王道.
- 好的编辑器有三个公理:
- dom内容和可见内容之间完美映射
- 也就是说同样的内容, 经过同样的操作得到同样的展示
- 同样的展示, 经过同样的逆操作可以变回同样的dom
- 这个明显就出事了, 同样的展示可是不能代表同样的dom
- 更别说各种不可见元素滑入了.
- 这一条是一个多对1关系, 多个dom对应同一个展示. 一个dom最多只有一种展示, 一个dom不会有多个展示.
- dom选择和可见选择之间完美映射
- 这一条要命了, 多对多
- 因为会有格式符嵌套这种事, 前面一堆标签然后出现了一个字, 那么我的光标定在哪一个层次上呢? 这事挺要命的, 我key进去的字是什么表现呢? 问帝哥都不行啊.
- 更要命的是行尾和下一行的开始也是同一个位置. 同样的dom位置不同的可见位置.
- 可见的编辑可以且只可以映射再可见的内容的全集
- 简单地说, 就是编辑的时候不要搞神秘代码, 比如手工注入标签.
- dom内容和可见内容之间完美映射
- 然后作者提出了一个他认为很好的模型:
- 一个段落paragraph的list, 和一个小结section的list
- 段落paragraph包括
- 文本, 纯文本
- 格式说明
- 图片或者附件的元数据
- 布局, 这个段落如何布置
- 小结section描述了段落的背景, 可能是几个段落公用
- 任何的选择(selection)都被描述为两个点.
- 点包含段落和段落内的偏移量.
- 还有选择类型
- 一般情况都是文本类型的选择.
- 媒体类型的选择
- section类型的选择
- 相同的展示会有并且仅有相同的dom模型再背后.
- 然后作者说他们怎么copy html进来, 这个有点奇怪, 按道理应该当做代码copy进来.
- 编辑有6个操作
- 插入段落paragraph
- 移除段落
- 更新段落
- 三个同样针对section的操作
- 作者提出chrome准备用shadow dom和 polymer element