当前位置:首页 > 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 已被标记为废弃,现代项目建议使用更先进的方案。

使用现代库

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

js 实现富文本编辑器

  • 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:更适合需要深度定制的场景

    js 实现富文本编辑器

    
    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 兼容模式提升用户体验

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

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

相关文章

elementui文本

elementui文本

ElementUI 文本组件 ElementUI 提供了多种文本相关的组件,用于展示和处理文本内容。以下是一些常用的文本组件及其用法: 文本展示组件 el-text 用于展示普通文本,支持自定义样式…

vue实现文本选取

vue实现文本选取

文本选取的基本实现 使用Vue实现文本选取功能可以通过结合原生JavaScript的Selection API完成。以下是一个基础示例,通过指令或方法监听文本选择事件: <template&g…

vue实现文本选中

vue实现文本选中

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

vue怎么实现文本对齐

vue怎么实现文本对齐

文本对齐的实现方法 在Vue中实现文本对齐可以通过CSS样式控制,以下是几种常见方法: 内联样式 直接在Vue模板中使用style绑定内联样式: <template> <di…

react如何自动复制文本

react如何自动复制文本

使用 Clipboard API React 应用中可以通过 Clipboard API 实现文本自动复制。现代浏览器支持 navigator.clipboard.writeText() 方法,调用时…

react如何编辑器就好了

react如何编辑器就好了

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