关于 contentEditable 可编辑DIV 实现在光标处插入自定义图片【已解决,可直接使用】

话不多说,直接出解决方案【复制代码可直接使用】

可编辑DIV也就是常说的富文本编辑器。当我们自己实现一个富文本编辑器时,需要设置div的可编辑属性 contenteditable="true"

解决方案

方案一、使用基础特性 document.execCommand
html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>contentEditable上传图片</title>
    <style>
        #editor{
            border: 1px solid #ccc; 
            width: 400px;
            height: 200px;
            margin-bottom: 30px;
        }
        #editor img{
            /* 需要图片换行的话,可以设置display:block; */
            display: block;
            max-width: 100px;
        }
    </style>
</head>
<body>
    <div id="editor" contenteditable="true">
        0123456789
    </div>
    <input type="file" name="file" id="uploadFile" onchange="uploadFile(event)"/>    
</body>
<script type="text/javascript" language="javascript">
    const edited = document.getElementById('editer');
    // 文件上传,模拟方法
    function uploadFile(e){
        const file = e.target.files[0]; // 需要上传到后台的图片
        // 文件上传,此处功能省略,直接使用假数据
        const filePath = 'https://img2.baidu.com/it/u=4259428193,1811830338&fm=253&fmt=auto&app=138&f=JPEG?w=750&h=500';
        // filePath为后台返回的图片地址
        document.execCommand('InsertImage', false, filePath);
    }
</script>
</html>
方案二、使用自定义方法插入【简单改造可实现在前面、后面插入】
html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>contentEditable上传图片</title>
    <style>
        #editor{
            border: 1px solid #ccc; 
            width: 400px;
            height: 200px;
            margin-bottom: 30px;
        }
        #editor img{
            /* 需要图片换行的话,可以设置display:block; */
            display: block;
            max-width: 100px;
        }
    </style>
</head>
<body>
    <div id="editor" contenteditable="true">
        0123456789
    </div>
    <input type="file" name="file" id="uploadFile" onchange="uploadFile(event)"/>    
</body>
<script type="text/javascript" language="javascript">
    const edited = document.getElementById('editer');
    // 文件上传,模拟方法
    function uploadFile(e){
        const file = e.target.files[0]; // 需要上传到后台的图片
        // 文件上传,此处功能省略,直接使用假数据
        const filePath = 'https://img2.baidu.com/it/u=4259428193,1811830338&fm=253&fmt=auto&app=138&f=JPEG?w=750&h=500';
        // filePath为后台返回的图片地址
        insertImageAtCursor(filePath)
    }
    // 在光标处插入图片
    const insertImageAtCursor = (url) => {
        const imgNode = document.createElement('img');
        imgNode.src = url;
        const selection = window.getSelection();
        const range = selection.getRangeAt(0);
        range.insertNode(imgNode);
        range.setStartAfter(imgNode);
        range.collapse(true);
        selection.removeAllRanges();
        selection.addRange(range);
    };
</script>
</html>

总结

关于 contentEditable,大家可以认真看一下官方文档哟~

希望上面的内容对你的工作学习有所帮助!欢迎各位一键三连哦~

各位 加油!

✨ 原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下

👍 点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!

相关推荐
先吃饱再说1 分钟前
层层传递太“痛”了:useContext 给 React 组件装了个“无线遥控器”
前端·react.js·前端框架
颜进强5 分钟前
前端看后端 15:什么是 DNS?
前端·后端·ai编程
文艺理科生9 分钟前
LangChain.js-v1-记忆管理最佳实践
前端·javascript·后端
子兮曰16 分钟前
Elysia vs Hono 完整性能对比:Bun 专属优化还是跨平台通用,2026 实测数据给出的答案
前端·后端·typescript
To_OC38 分钟前
从一个颜色选择器说起:我终于整明白了 React+TS 里的 model 与 api 分层
前端·react.js·typescript
赵大仁39 分钟前
浏览器端 RAG:Transformers.js + WebGPU 本地检索入门
前端·ai·react·webgpu·rag
zyplayer-doc42 分钟前
同一份制度别复制到多个知识库:用zyplayer-doc引用文档解决重复维护
javascript·人工智能·智能手机·开源·ocr
木叶丸1 小时前
从 Loop 到 Graph:AI 智能体协作系统工程指南
前端·后端·架构
吴懿不在 不负信仰2 小时前
从jQuery谈库与框架的设计之优劣
前端·javascript·jquery
灵析表格2 小时前
灵析表格手机号处理函数深度分析报告
前端·网络·json·wps·灵析表格·excel公式盒子