当前位置:首页 > JavaScript

js 实现富文本编辑器

2026-04-04 12:43:37JavaScript

实现富文本编辑器的核心方法

使用contenteditable属性

通过HTML的contenteditable属性快速创建可编辑区域:

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

结合CSS定义编辑区域样式:

#editor {
  min-height: 200px;
  border: 1px solid #ccc;
  padding: 10px;
}

基本命令操作

通过document.execCommand执行格式化命令(注意:该API已废弃,但部分场景仍可用):

function formatText(command, value = null) {
  document.execCommand(command, false, value);
}
// 示例:加粗选中文本
formatText('bold');

现代API替代方案

使用Selection和Range API实现更精细的控制:

function insertHtml(html) {
  const selection = window.getSelection();
  if (selection.rangeCount) {
    const range = selection.getRangeAt(0);
    range.deleteContents();
    const fragment = range.createContextualFragment(html);
    range.insertNode(fragment);
  }
}

工具栏实现

创建带有事件监听的格式工具栏:

<div class="toolbar">
  <button data-command="bold">加粗</button>
  <button data-command="italic">斜体</button>
  <input type="color" onchange="formatText('foreColor', this.value)">
</div>

JavaScript事件绑定:

document.querySelectorAll('.toolbar button').forEach(btn => {
  btn.addEventListener('click', () => {
    formatText(btn.dataset.command);
  });
});

内容状态管理

监听输入事件并保存内容:

const editor = document.getElementById('editor');
editor.addEventListener('input', () => {
  const content = editor.innerHTML;
  // 保存或处理内容
});

高级功能实现

  1. 自定义快捷键:

    editor.addEventListener('keydown', (e) => {
    if (e.ctrlKey && e.key === 'b') {
     e.preventDefault();
     formatText('bold');
    }
    });
  2. 图片上传处理:

    function handleImageUpload(file) {
    const reader = new FileReader();
    reader.onload = (e) => {
     insertHtml(`<img src="${e.target.result}">`);
    };
    reader.readAsDataURL(file);
    }
  3. 内容过滤(防XSS):

    js 实现富文本编辑器

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

第三方库推荐

  1. ProseMirror:模块化架构,适合需要自定义Schema的场景
  2. Tiptap:基于ProseMirror的友好封装
  3. Quill:提供丰富的主题和模块
  4. CKEditor 5:企业级解决方案

现代开发建议

  1. 优先考虑使用现有的开源库
  2. 需要自定义功能时采用组合式开发
  3. 移动端需特别注意触摸事件处理
  4. 实现撤销/重做功能可使用Command Pattern

性能优化要点

  1. 对高频操作进行防抖处理
  2. 大型文档采用虚拟滚动
  3. 复杂操作使用requestIdleCallback
  4. 定期清理无用的DOM节点

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

相关文章

vue实现文本域

vue实现文本域

在Vue中实现文本域 Vue中可以通过<textarea>元素实现文本域功能,结合v-model实现双向数据绑定。以下是具体实现方法: 基础实现 <template>…

vue如何实现富文本

vue如何实现富文本

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

vue 富文本实现原理

vue 富文本实现原理

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

react如何自动复制文本

react如何自动复制文本

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

react如何文本折行

react如何文本折行

文本折行的实现方法 在React中实现文本折行可以通过CSS样式或JavaScript逻辑处理。以下是几种常见的方法: 使用CSS样式控制 通过CSS的white-space和word-wrap属性…

css 文本制作

css 文本制作

基础文本样式设置 使用 font-family 定义字体,font-size 调整字号,color 设置文字颜色。例如: .text-example { font-family: 'Arial'…