当前位置:首页 > JavaScript

js 实现富文本编辑器

2026-03-01 11:58:51JavaScript

实现富文本编辑器的方法

使用 contenteditable 属性

HTML5 的 contenteditable 属性可以让任何 DOM 元素变成可编辑状态。这是实现富文本编辑器的基础。

<div id="editor" contenteditable="true"></div>

通过 JavaScript 可以监听用户输入并添加样式:

document.getElementById('editor').addEventListener('input', function() {
    // 处理输入内容
});

使用 document.execCommand

这是传统的富文本编辑 API,可以直接执行格式化命令:

// 加粗选中文本
document.execCommand('bold', false, null);

// 插入链接
document.execCommand('createLink', false, 'https://example.com');

虽然简单易用,但该 API 已被标记为废弃,现代项目建议使用更先进的方案。

使用现代库

目前主流的富文本编辑器库包括:

  • Quill:模块化设计,支持自定义格式和扩展

    const quill = new Quill('#editor', {
      theme: 'snow',
      modules: {
          toolbar: [
              [{ header: [1, 2, false] }],
              ['bold', 'italic', 'underline'],
              ['image', 'code-block']
          ]
      }
    });
  • TinyMCE:功能全面,商业项目常用

    tinymce.init({
      selector: '#editor',
      plugins: 'advlist link image lists',
      toolbar: 'undo redo | styleselect | bold italic'
    });
  • ProseMirror:更适合需要深度定制的场景

    
    import { EditorState } from "prosemirror-state";
    import { EditorView } from "prosemirror-view";
    import { schema } from "prosemirror-schema-basic";

let state = EditorState.create({ schema }); let view = new EditorView(document.querySelector("#editor"), { state });


#### 自定义实现
对于需要完全控制的情况,可以基于 Selection 和 Range API 自行实现:

```javascript
function applyStyle(style) {
    const selection = window.getSelection();
    if (selection.rangeCount > 0) {
        const range = selection.getRangeAt(0);
        const span = document.createElement('span');
        span.style[style.property] = style.value;
        range.surroundContents(span);
    }
}

处理内容安全

富文本编辑器需要特别注意 XSS 防护:

function sanitize(html) {
    const temp = document.createElement('div');
    temp.textContent = html;
    return temp.innerHTML;
}

或者使用专门的库如 DOMPurify:

const clean = DOMPurify.sanitize(dirtyHTML);

实现撤销/重做

使用命令模式记录操作历史:

class History {
    constructor() {
        this.stack = [];
        this.index = -1;
    }
    push(state) {
        this.stack.length = this.index + 1;
        this.stack.push(state);
        this.index++;
    }
    undo() {
        if (this.index > 0) {
            this.index--;
            return this.stack[this.index];
        }
    }
    redo() {
        if (this.index < this.stack.length - 1) {
            this.index++;
            return this.stack[this.index];
        }
    }
}

注意事项

  • 移动端需要特别处理触摸事件和虚拟键盘
  • 不同浏览器对 contenteditable 的实现有差异
  • 复杂格式(如表格、嵌套列表)需要额外处理
  • 考虑添加 Markdown 兼容模式提升用户体验

现代富文本编辑器实现通常结合多种技术,建议根据项目需求选择合适的方案或现有库。

js 实现富文本编辑器

标签: 编辑器文本
分享给朋友:

相关文章

vue实现文本选中

vue实现文本选中

Vue 实现文本选中功能的方法 使用 window.getSelection() API 在 Vue 中可以通过 window.getSelection() 获取用户选中的文本内容。监听 mouseu…

vue如何实现富文本

vue如何实现富文本

使用 vue-quill-editor 实现富文本 安装 vue-quill-editor 依赖 npm install vue-quill-editor --save 在组件中引入并使用 imp…

vue实现文本插值

vue实现文本插值

文本插值的基本语法 在Vue中,文本插值通过双大括号{{ }}实现,将数据绑定到DOM元素中。例如: <div id="app"> {{ message }} </div>…

vue 富文本实现原理

vue 富文本实现原理

Vue 富文本实现原理 Vue 中实现富文本编辑通常基于现成的库(如 Quill、TinyMCE)或原生 contenteditable 属性。以下是核心实现原理和技术要点: 基于 content…

react如何获取标签文本内容

react如何获取标签文本内容

获取标签文本内容的方法 在React中获取DOM元素的文本内容可以通过多种方式实现,以下是常见的几种方法: 使用ref获取文本内容 通过useRef钩子创建引用并绑定到目标元素上,通过curr…

react如何编辑器就好了

react如何编辑器就好了

在React中实现编辑器功能 React中实现编辑器功能可以通过多种方式,常见的方案包括使用现成的富文本编辑器库或自定义实现。以下是几种主流方法: 使用现成的富文本编辑器库 Draft.js Fac…