当前位置:首页 > JavaScript

js实现富文本编辑器

2026-04-04 09:55:31JavaScript

实现富文本编辑器的基本方法

使用JavaScript实现富文本编辑器通常基于contenteditable属性或现成的库。以下是两种主要方法:

基于contenteditable的简单实现 创建一个可编辑的div元素,通过document.execCommand执行格式化命令:

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

<script>
function formatText(cmd) {
    document.execCommand(cmd, false, null);
    document.getElementById('editor').focus();
}
</script>

使用现有库(推荐) 主流库提供更完整的解决方案:

核心功能实现要点

选区与范围处理 通过window.getSelection()获取当前选区:

const selection = window.getSelection();
const range = selection.getRangeAt(0);

自定义命令封装 封装常见操作命令:

function insertHTML(html) {
    const selection = window.getSelection();
    if (selection.rangeCount) {
        const range = selection.getRangeAt(0);
        range.deleteContents();
        const div = document.createElement('div');
        div.innerHTML = html;
        const frag = document.createDocumentFragment();
        while (div.firstChild) {
            frag.appendChild(div.firstChild);
        }
        range.insertNode(frag);
    }
}

进阶功能实现

图片上传处理 使用FileReader实现本地图片预览:

document.getElementById('file-input').addEventListener('change', function(e) {
    const file = e.target.files[0];
    const reader = new FileReader();
    reader.onload = function(event) {
        insertHTML(`<img src="${event.target.result}">`);
    };
    reader.readAsDataURL(file);
});

撤销/重做功能 通过记录操作状态实现:

const history = [];
let historyIndex = -1;

function saveState() {
    const html = editor.innerHTML;
    history.length = historyIndex + 1;
    history.push(html);
    historyIndex++;
}

安全考虑

XSS防护 使用DOMPurify过滤HTML:

import DOMPurify from 'dompurify';

function safeInsert(html) {
    const clean = DOMPurify.sanitize(html);
    insertHTML(clean);
}

粘贴内容处理 拦截paste事件进行过滤:

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

响应式设计建议

移动端适配 针对触摸设备优化:

if ('ontouchstart' in window) {
    editor.style.minHeight = '300px';
    editor.style.fontSize = '16px';
}

暗黑模式支持 通过CSS变量切换样式:

js实现富文本编辑器

#editor.dark {
    --bg-color: #222;
    --text-color: #eee;
}

以上方法提供了从基础到进阶的实现方案,可根据项目需求选择适当的技术路径。使用现成库能快速获得生产级功能,而自定义实现则更适合特定场景需求。

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

相关文章

vue实现文本截断

vue实现文本截断

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

vue实现文本插值

vue实现文本插值

文本插值的基本语法 在Vue中,文本插值通过双大括号{{ }}实现,将数据绑定到DOM元素中。例如: <div id="app"> {{ message }} </div>…

react如何获取标签文本内容

react如何获取标签文本内容

获取标签文本内容的方法 在React中获取DOM元素的文本内容可以通过多种方式实现,以下是常见的几种方法: 使用ref获取文本内容 通过useRef钩子创建引用并绑定到目标元素上,通过curren…

使用react-quill如何获取文本

使用react-quill如何获取文本

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

js实现文本编辑器

js实现文本编辑器

实现基础文本编辑器 使用HTML的contenteditable属性快速创建一个可编辑区域,结合JavaScript监听用户输入和操作。以下是一个简单实现: <div id="editor"…

js 实现富文本编辑器

js 实现富文本编辑器

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