前端可视化编辑的关键是啥?html两个属性:contenteditable和designMode

1,316 阅读2分钟

前端可视化编辑的关键是啥?html两个属性:contenteditable和designMode

需求场景描述

web前端的程序员,富文本编辑器很常见,可视化编辑也听说过不少?那么有没有好奇过实现网页可编辑,实现可视化编辑的关键技术可能是啥?

我遇到一个需求,就是在一个富文本插件上,增加一个功能,就是可视化编辑。大概是实现,不用input类的表单组件,实现h1标题可编辑,一段文字p可编辑,即是在页面,所见即所得,所写即所得。

我认为HTML的两个属性contenteditable和designMode,可能是网页或网页元素可视化编辑的关键,接下来逐一认识下。

先看下Demo效果:

GIF 2022-4-10 13-11-22.gif

认识contenteditable和designMode

① contenteditable:

是一个枚举属性,表示元素是否可被用户编辑。 如果可以,浏览器会修改元素的部件以允许编辑。可通过设置为true/false 设定元素是否可编辑。例如:

<p contenteditable="true">这人一篇可编辑的文章</p>

注意事项

1.ontenteditable属性是可以被继承的,这意味着,我们如果将body的ontenteditable设置为true,那么整个body的子元素都是可编辑的。

2.ontenteditable属性是一个枚举属性,而不是一个Boolean值。这的意思是我们必须显式设置它的值为 true、false 或空字符串中的一个。

错误的写法

<label contenteditable>这种简写是无效的</label>

正确的写法

<label contenteditable="true">这是有效的写法,必须写明其值,枚举列出了true、false为其有效值</label>

② designMode:

document.designMode 控制整个文档是否可编辑。有效值为 "on" 和 "off" 。根据规范,该属性默认为 "off" 。Firefox 遵循此标准。早期版本的 Chrome 和 IE默认为 "inherit" 。从 Chrome 43 开始,默认值为 "off" ,并且不再支持 "inherit"。在 IE6 到 IE10 中,该值为大写。

designMode:on/off 设置文档对象是否(例如iframe)可编辑。

设置一个普通文档的用法

document.designMode = "on" || "off";

设置一个iframe的用法

<iframe id="iframe" src="./iiframe-edit.html"></iframe>
onst iframe = document.getElementById("iframe");
iframe.contentDocument.designMode = "on";

注意,这种直接在iframe标签上给designMode赋值的写法是无效的

<iframe id="iframe" designMode = "on" src="./iiframe-edit.html"></iframe>

两各属性的浏览器兼容性

image.png

image.png

完整示例Demo代码

image.png