当前位置:首页 > JavaScript

js实现文本编辑器

2026-03-01 03:44:43JavaScript

实现基础文本编辑器

使用HTML的contenteditable属性创建一个可编辑区域,结合JavaScript实现基本功能:

<div id="editor" contenteditable="true"></div>
<button onclick="formatText('bold')">加粗</button>
<button onclick="formatText('italic')">斜体</button>

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

使用document.execCommand

通过浏览器内置API实现常见编辑功能:

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

// 修改字体大小
document.execCommand('fontSize', false, '5');

// 撤销/重做
document.execCommand('undo');
document.execCommand('redo');

使用现代API(Selection/Range)

对于更精细的控制,操作文本选区:

function insertTextAtCursor(text) {
    const selection = window.getSelection();
    const range = selection.getRangeAt(0);
    range.deleteContents();
    range.insertNode(document.createTextNode(text));
}

集成第三方库

推荐使用成熟的编辑器库:

  • Quill.js

    js实现文本编辑器

    const quill = new Quill('#editor', {
      modules: { toolbar: true },
      theme: 'snow'
    });
  • ProseMirror

    import { EditorState } from "prosemirror-state";
    import { EditorView } from "prosemirror-view";
    import { schema } from "prosemirror-schema-basic";
    
    const view = new EditorView(document.querySelector("#editor"), {
      state: EditorState.create({ schema })
    });

实现自定义工具栏

创建带有状态反馈的UI控件:

document.getElementById('bold-btn').addEventListener('click', () => {
    const isActive = document.queryCommandState('bold');
    document.execCommand('bold', false, null);
    updateButtonState('bold-btn', !isActive);
});

function updateButtonState(btnId, active) {
    const btn = document.getElementById(btnId);
    btn.style.backgroundColor = active ? '#ddd' : '';
}

处理内容变化

监听编辑器内容变更:

js实现文本编辑器

const editor = document.getElementById('editor');
editor.addEventListener('input', () => {
    console.log('Content changed:', editor.innerHTML);
});

// 对于第三方库
quill.on('text-change', (delta, oldDelta, source) => {
    console.log('Content changed:', quill.getContents());
});

实现Markdown支持

将Markdown转换为HTML:

import marked from 'marked';

function renderMarkdown(content) {
    editor.innerHTML = marked(content);
}

添加图片上传功能

处理文件选择和上传:

document.getElementById('upload-btn').addEventListener('change', (e) => {
    const file = e.target.files[0];
    const reader = new FileReader();
    reader.onload = (event) => {
        document.execCommand('insertImage', false, event.target.result);
    };
    reader.readAsDataURL(file);
});

实现版本历史

记录编辑历史:

let history = [];
let currentIndex = -1;

editor.addEventListener('input', () => {
    const content = editor.innerHTML;
    history = history.slice(0, currentIndex + 1);
    history.push(content);
    currentIndex = history.length - 1;
});

function undo() {
    if (currentIndex > 0) {
        currentIndex--;
        editor.innerHTML = history[currentIndex];
    }
}

响应式设计考虑

确保编辑器适应不同屏幕尺寸:

#editor {
    min-height: 200px;
    border: 1px solid #ddd;
    padding: 10px;
    resize: vertical;
    overflow-y: auto;
}

@media (max-width: 600px) {
    .toolbar { flex-wrap: wrap; }
    .toolbar button { padding: 5px; }
}

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

相关文章

vue怎么实现文本代码实现

vue怎么实现文本代码实现

Vue 实现文本代码展示的方法 在 Vue 中展示代码块或格式化文本,可以通过多种方式实现。以下是几种常见方法: 使用 <pre> 和 <code> 标签 最简单的原生 HT…

vue实现文本选取

vue实现文本选取

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

vue实现文本对比

vue实现文本对比

Vue 实现文本对比功能 文本对比功能可以通过比较两个文本内容的差异,并以可视化的方式展示差异部分。以下是几种实现方式: 使用 diff-match-patch 库 diff-match-patc…

vue实现文本域

vue实现文本域

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

vue实现文本滚动

vue实现文本滚动

实现文本滚动的几种方法 使用CSS动画 通过CSS的@keyframes和transform属性实现横向或纵向滚动效果。适用于简单的单行文本滚动。 <template> <d…

vue如何实现复制文本

vue如何实现复制文本

使用 document.execCommand 方法(传统方式) 在 Vue 中可以通过调用原生的 document.execCommand 方法实现复制文本功能。创建一个方法,动态创建一个 text…