当前位置:首页 > JavaScript

js实现文本编辑器

2026-04-04 04:19:01JavaScript

实现基础文本编辑器

使用contenteditable属性创建可编辑区域是最简单的方式。通过设置HTML元素的contenteditable="true",可以让任何元素变成可编辑状态。

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

添加基础样式增强编辑体验:

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

添加格式控制按钮

创建工具栏按钮来控制文本格式,使用document.execCommand执行格式化命令:

<div class="toolbar">
  <button onclick="formatText('bold')">加粗</button>
  <button onclick="formatText('italic')">斜体</button>
  <button onclick="formatText('underline')">下划线</button>
</div>

<script>
function formatText(command) {
  document.execCommand(command, false, null);
}
</script>

实现选区保持

在修改编辑器内容时保持当前选区:

function saveSelection() {
  const selection = window.getSelection();
  const range = selection.getRangeAt(0);
  return range;
}

function restoreSelection(range) {
  const selection = window.getSelection();
  selection.removeAllRanges();
  selection.addRange(range);
}

支持更多格式选项

扩展execCommand支持的其他格式操作:

function setFontSize(size) {
  document.execCommand('fontSize', false, '7');
  const fontElements = document.getElementsByTagName('font');
  for (let i = 0; i < fontElements.length; i++) {
    if (fontElements[i].size === '7') {
      fontElements[i].removeAttribute('size');
      fontElements[i].style.fontSize = size + 'px';
    }
  }
}

实现撤销/重做功能

使用document.execCommand的撤销和重做命令:

function undo() {
  document.execCommand('undo', false, null);
}

function redo() {
  document.execCommand('redo', false, null);
}

使用自定义数据存储

对于更复杂的编辑器,可以使用自定义数据结构存储内容:

class EditorState {
  constructor(content, selection) {
    this.content = content;
    this.selection = selection;
  }
}

class EditorHistory {
  constructor() {
    this.states = [];
    this.currentIndex = -1;
  }

  pushState(state) {
    this.states = this.states.slice(0, this.currentIndex + 1);
    this.states.push(state);
    this.currentIndex++;
  }
}

实现现代编辑器方案

对于生产环境,推荐使用专业库如:

  • ProseMirror
  • Tiptap
  • Slate.js
  • Quill
  • CKEditor

这些库提供了更完整的解决方案,包括协作编辑、插件系统等高级功能。

处理粘贴内容

清理粘贴的HTML内容:

document.getElementById('editor').addEventListener('paste', (e) => {
  e.preventDefault();
  const text = (e.clipboardData || window.clipboardData).getData('text/plain');
  document.execCommand('insertText', false, text);
});

添加Markdown支持

将Markdown转换为HTML:

function markdownToHtml(markdown) {
  // 简单替换实现
  return markdown
    .replace(/^# (.*$)/gm, '<h1>$1</h1>')
    .replace(/^## (.*$)/gm, '<h2>$1</h2>')
    .replace(/\*\*(.*)\*\*/g, '<strong>$1</strong>')
    .replace(/\*(.*)\*/g, '<em>$1</em>');
}

实现自动保存

定时保存编辑器内容:

js实现文本编辑器

setInterval(() => {
  const content = document.getElementById('editor').innerHTML;
  localStorage.setItem('editorContent', content);
}, 5000);

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

相关文章

vue 富文本实现原理

vue 富文本实现原理

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

react如何自动复制文本

react如何自动复制文本

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

使用react-quill如何获取文本

使用react-quill如何获取文本

获取 React-Quill 编辑器文本内容 使用 react-quill 获取编辑器中的文本内容可以通过以下几种方法实现: 方法一:通过 onChange 事件获取 在组件中绑定 onChang…

js实现富文本编辑器

js实现富文本编辑器

使用 contenteditable 属性实现基础富文本编辑器 通过 HTML 的 contenteditable 属性可以让元素变为可编辑状态,这是实现富文本编辑器的基础。 <div i…

js 实现富文本编辑器

js 实现富文本编辑器

实现富文本编辑器的基本方法 使用JavaScript实现富文本编辑器可以通过原生API或第三方库完成。以下是几种常见方案: 使用contentEditable属性 HTML5的contentEdit…

vue实现按钮改变文本

vue实现按钮改变文本

实现按钮改变文本的方法 在Vue中,可以通过数据绑定和事件处理实现按钮点击改变文本的功能。以下是几种常见实现方式: 使用v-on和v-text指令 <template> <…