【富文本】知多少

396 阅读2分钟

Rich Text format(RTF)来源

当前端需要处理大量文本时,一般情况下只能用textarea,需要加个图片时,还需要额外加标签,实在太单调了,无法满足开发需求😌

总有某个功能块,想要图文并茂的效果,就像微信推文那样,梦想还是要有的,万一……🤣这不,富文本就这样诞生了,开发者们也纷纷开始了踩坑之旅……

本篇仅限于了解【富文本】,后续项目有需要再深入

富文本编辑器

Rich Text Editor(RTE),一种可以内嵌于浏览器,所见即所得的文本编辑器

常见富文本框编辑器(简直不要太多💀)

blog.csdn.net/qq_38200194…

富文本原理

contenteditable 属性

contenteditable 是一个枚举属性,表示元素是否可被用户编辑,当给标签加上contenteditable='true'时,就变成可编辑

document.execCommand

富文本的核心

MDN描述

当一个HTML文档切换到设计模式时,document暴露 execCommand 方法,该方法允许运行命令来操纵可编辑内容区域的元素
bool = document.execCommand(aCommandName, aShowDefaultUI, aValueArgument)
// document.execCommand(命令名称,是否展示用户界面,命令需要的额外参数)
// 第三个参数就是一些命令可能需要额外的参数,比如插入图片就要多传个 url 或 base64 的参数,没有则为null

浏览器提供该方法,实现其他操作(比如加粗、倾斜、插入图片等等)

使用举例:

// 加粗
document.execCommand('bold', false, null);
// 添加图片
document.execCommand('insertImage', false, url || base64);
// 把一段文字用 p 标签包裹起来
document.execCommand('formatblock', false, '<p>');

项目中遇到的问题

项目里面有个功能块,里面的主体内容是富文本编辑器生成的,但是项目的css reset会影响到富文本的样式

解决方案:iframe

 {
    test: /richText.html$/,
    use: [
      {
        loader: require.resolve('html-loader')
      }
    ]
 },
    
import richText from './richText.html';
 
load = () => {
    const { props } = this;
    const { loadRequire } = props.detail;
    const oIframe = document.getElementById('richTextFrame');
    oIframe.contentWindow.document.body.innerHTML = loadRequire;
    this.setState({
      // iFrameHeight: `${oIframe.contentWindow.document.body.scrollHeight + 100}px`,
    });
};
  
 <iframe
    id="richTextFrame"
    onLoad={this.load}
    title="Inline Frame Example"
    width="100%"
    height="auto"
    frameBorder="0"
    srcDoc={richText}>
  </iframe>

如何开发富文本编辑器

富文本编辑器主要就是设计模式中命令模式的一种具体应用,把编辑器中的每一个单一功能做成一个命令(Command),然后绑定按钮/快捷键去触发对应的命令(比如利用自定义事件来触发),每一个命令针对编辑器中的内容进行操作,生成新的内容然后替换/更改之前的内容。

核心就是 document.execCommand,可以参看 MDN上的文档;别的用到比较多的就是 window.getSelection() 这些方法;需要后端配合的,一般就是上传图片,保存、读取内容这些;

juejin.cn/post/684490…