当前位置:首页 > 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实现更精细的控制:

js 实现富文本编辑器

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);
  });
});

内容状态管理

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

js 实现富文本编辑器

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):

    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 可以通过多种方式实现文本列表的渲染和管理,以下是几种常见的方法: 使用 v-for 指令渲染列表 通过 v-for 指令可以动态渲染数组或对象中的文本列表。 &…

vue实现文本截断

vue实现文本截断

文本截断的实现方法 在Vue中实现文本截断可以通过多种方式完成,以下是几种常见的方法: CSS方法 使用CSS的text-overflow属性可以简单实现文本截断效果: <div c…

react如何文本折行

react如何文本折行

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

JS实现文本的删除

JS实现文本的删除

使用 substring() 方法 通过指定起始和结束索引截取字符串的一部分,间接实现删除效果。 let str = "Hello World"; let newStr = str.substr…

js实现文本追踪

js实现文本追踪

实现文本追踪的方法 使用JavaScript实现文本追踪通常涉及监听用户输入、选择或修改文本的行为。以下是几种常见的实现方式: 监听输入事件 通过addEventListener绑定input或ke…

php实现文本换行

php实现文本换行

使用 nl2br 函数 PHP 提供了 nl2br 函数,可以将字符串中的换行符(\n 或 \r\n)转换为 HTML 的 <br> 或 <br /> 标签,从而实现文本换行显…