当前位置:首页 > 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

    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' : '';
}

处理内容变化

监听编辑器内容变更:

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

响应式设计考虑

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

js实现文本编辑器

#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 中实现文本标记功能,可以通过以下几种方式实现,具体取决于需求场景(如高亮关键词、添加样式标记等)。 使用 v-html 动态渲染带标记的文本 通过字符串替换或…

vue怎么实现文本对齐

vue怎么实现文本对齐

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

vue如何实现富文本

vue如何实现富文本

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

vue实现文本查找功能

vue实现文本查找功能

实现文本查找功能的基本思路 在Vue中实现文本查找功能,通常需要监听用户输入的关键词,并在目标文本中进行匹配和突出显示。可以通过计算属性或方法来处理文本匹配逻辑。 核心代码实现 <te…

使用react-quill如何获取文本

使用react-quill如何获取文本

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

css文本制作

css文本制作

使用CSS设置文本样式 字体属性 通过font-family可以指定文本字体,支持多个备选字体。font-size控制文字大小,单位可以是px、em或rem。font-weight调整粗细,取值范围1…