首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Contenteditable div -无法删除带有退格键的内部HTML节点

基础概念

contenteditable 是一个 HTML 属性,它允许用户直接在元素内编辑内容。当一个元素被设置为 contenteditable 时,用户可以通过键盘和鼠标对其进行编辑,就像在一个文本编辑器中一样。

相关优势

  1. 用户友好:允许用户直接在页面上进行编辑,无需打开外部编辑器。
  2. 灵活性:可以应用于任何 HTML 元素,不仅仅是文本。
  3. 实时反馈:用户可以看到他们的更改立即反映在页面上。

类型与应用场景

  • 类型:主要应用于需要用户直接编辑内容的场景,如富文本编辑器、在线文档编辑等。
  • 应用场景
    • 博客平台的文章编辑器。
    • 在线表单填写页面。
    • 内容管理系统(CMS)中的内容编辑。

问题描述

在使用 contenteditablediv 中,有时会遇到无法通过退格键删除内部 HTML 节点的问题。这通常是由于浏览器的默认行为或 JavaScript 事件处理不当导致的。

原因分析

  1. 浏览器默认行为:某些浏览器在处理退格键时可能会有不同的行为,尤其是在存在复杂嵌套结构时。
  2. JavaScript 事件处理:可能存在事件监听器阻止了默认的退格键行为,或者在处理删除操作时逻辑不正确。

解决方案

方法一:使用 JavaScript 监听退格键事件

可以通过 JavaScript 监听退格键事件,并手动处理删除操作。以下是一个示例代码:

代码语言:txt
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Contenteditable Div</title>
</head>
<body>
    <div id="editableDiv" contenteditable="true">
        <p>This is a <span>test</span> paragraph.</p>
    </div>

    <script>
        document.getElementById('editableDiv').addEventListener('keydown', function(event) {
            if (event.key === 'Backspace' || event.key === 'Delete') {
                const selection = window.getSelection();
                const range = selection.getRangeAt(0);
                const startNode = range.startContainer;
                const endNode = range.endContainer;

                if (startNode.nodeType === Node.TEXT_NODE && startNode.textContent.length === 0) {
                    const parent = startNode.parentNode;
                    if (parent.nodeType === Node.ELEMENT_NODE && parent.childNodes.length === 1) {
                        parent.parentNode.removeChild(parent);
                    }
                }
            }
        });
    </script>
</body>
</html>

方法二:使用第三方库

可以使用一些成熟的富文本编辑器库,如 Quill.js 或 TinyMCE,这些库已经处理了大部分复杂的编辑逻辑,包括退格键删除节点的问题。

示例:使用 Quill.js

代码语言:txt
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Quill Editor</title>
    <link href="https://cdn.quilljs.com/1.3.6/quill.snow.css" rel="stylesheet">
</head>
<body>
    <div id="editor"></div>

    <script src="https://cdn.quilljs.com/1.3.6/quill.js"></script>
    <script>
        var quill = new Quill('#editor', {
            theme: 'snow'
        });
    </script>
</body>
</html>

总结

通过上述方法,可以有效解决 contenteditable div 中无法删除内部 HTML 节点的问题。使用 JavaScript 手动处理退格键事件或借助成熟的富文本编辑器库,可以提供更好的用户体验和更稳定的编辑功能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 前端富文本基础及实现

    例如: 富文本编辑器中的富文本,是由红色框中带有语义化标签和内联样式的 html 渲染实现的。通过富文本编辑器,即可实现富文本的编写、展示。...效果如图: 元素设置 contenteditable 第二种方式是使用 contenteditable 属性指定 HTML 文档中的元素。该方式是 IE 最早实现的。...效果如图: 两者特点 两种方式都可以实现编辑模式,并且这种编辑模式与 textarea 不同,其内部会用块级元素(默认为 div 元素)做换行处理,最终体现在 dom 结构中。...两者不同的是:iframe 方式可做到样式隔离,内部样式与外部样式不存在污染与冲突( tinymce 实现方式);元素设置 contentEditable 的方式( wangEditor 等实现方式)则和其他元素一样受到页面...方式 div class="rt-container" contenteditable="true">政采云前端团队div> ------------------------------

    4.6K50

    【实战】我是如何在输入框实现@ At功能的

    ) 当前需求的拆解 按住shift + @ 的时候,弹出通知列表 选择时 @的用户标签插入当前的光标位置中 生成@的用户标签的规则是:高亮、携带用户ID、一键删除信息、不可以编辑。...所以推荐下面的库给大家、只要稍作改动就可以使用啦~~ Tribute.js(推荐, ES6) At.js JQ) contenteditable (例:QQ空间, 掘金) HTML5新属性规定元素内容是否可编辑...xxxx,这里就省略了 // this.openXXX.. } } 说完@的事件的监听、现在我们可以聊聊怎么生成 @的标签了,而且 @的标签又是再怎么一键删除的?...生成@的用户标签的规则是:高亮、携带用户ID、一键删除信息、不可以编辑 /** * 数据结构: * userList: [{name: '坏女人', uid: 18}, {name: '好男人', uid...// 需要在字符前插入一个空格否则、在换行与两个@标签连续的时候导致无法删除标签 let spanNode = document.createElement('span'); spanNode.innerHTML

    2.7K20

    你不知道的 DOM 变动观察器:Mutation observer

    —— 添加/删除的节点, previousSibling/nextSibling —— 添加/删除的节点的上一个/下一个兄弟节点, attributeName/attributeNamespace —...例如,这里有一个 div>,它具有 contentEditable 特性。该特性使我们可以聚焦和编辑元素。...div contentEditable id="elem">Click and edit, pleasediv> let observer = new MutationObserver...我们可以在 HTML 中添加/删除代码段,而无需考虑高亮问题。 其他方法 有一个方法可以停止观察节点: observer.disconnect() —— 停止观察。...垃圾回收: 观察器在内部对节点使用弱引用。也就是说,如果一个节点被从 DOM 中移除了,并且该节点变得不可访问,那么它就可以被垃圾回收。 观察到 DOM 节点这一事实并不能阻止垃圾回收。

    2.2K10

    手把手教你实现网页端社交应用中的@人功能:技术原理、代码示例等

    键关闭搜索弹窗; 4)选择需要@的用户,把对应的HTML文本替换到原文本上,在HTML文本上添加用户的元数据。...每个点都被表示为一个带有相对于起点的相对偏移(offset)的父 DOM 节点。如果父节点是元素节点,则偏移量是子节点的编号,对于文本节点,则是文本中的位置。...综上所述:一般我们只有一个 Range,当我们的光标在 contenteditable 的 div 上闪动的时候,其实就有了一个 Range,这个 Range 的开始和结束位置都是一样的。...8.2 创建 At 标签 为了能实现删除键能把删除全部删除,需要把 at 标签的内容包裹起来。...现在需要做的是:把旧的文本节点删除,然后在原来的位置上依次插入『请帮我泡一杯咖啡』、【@ABC】、『这是后面的内容』。

    1.3K10

    【js】Input事件

    当用户按下/释放键盘上的任意键时触发 3 event.keyCode,返回键盘上按键对应的特定键码 (兼容性:分号在Firefox,Opera上返回的是ASCII码,在IE,Safari上返回键码)...4 event.charCode = 0 这两个事件触发时,总返回0 keypress 1 全部浏览器支持 2 当用户按下字符键时触发 3 event.charCode,返回键盘上按键对应的ASCII码...支持,别的浏览器不支持 2 在文本插入文本框之前触发,便于检查拦截用户输入使用 3 在input:text,input:password,input:search,textarea以及元素是contentEditable...) 4 IE9中此事件有bug,在多种删除方式(使用退格键(Backspace),删除键(Delete),Ctrl+X,右键菜单中的剪切和删除)不会被实时触发 5 IE9种需要使用addEventListener...https://javaforall.cn/135135.html原文链接:https://javaforall.cn

    10.3K30

    Notion 编辑器原理分析

    op 有了数据模型后,接下来是需要对这棵数据模型进行修改,在 dom api 里,浏览器提供了节点的删除、增加、修改(属性)、移动等功能 。...在 notion 里也一样,数据层通过提供 op 的方式给到渲染层来修改数据,常规对树的操作可以有两类: 节点位置移动、增加、删除 节点属性修改 下面举几个在 notion 中的 demo: 修改属性...如用户一个字符一个字符依次输入,我们再撤回时也是一个字符一个字符的删,这显然是不合理的,就像 contenteditable 一样,撤回时一次可删除多个字符,这个缓冲时间就是起这个作用的。...文字操作 文字节点也是一个普通的 block,只是他承载的是文字输入与呈现,输出为 contenteditable div,就如 facebook draft 的视频中所说,需要一个 controlled...渲染组件将文字 block type 渲染成了如上 contenteditable div 节点 文字存储与渲染 一段文字会有某一区间加粗、颜色不同、等不同样式,先看下是怎么存储的。 ?

    2.6K30

    contenteditable跟style标签可真是天生一对

    contenteditable是html的一个全局属性,可以大致理解为"可以使一个元素处于可编辑状态",像极了textarea,不过还是存在许多不足跟问题,比如没有change钩子等,本文不作深入探讨❌...01 开胃 使一个div可以进行内容编辑: div contenteditable>点击我进行编辑div> ?...因此有如下代码: contenteditable> html { background-color: #f1f1f1; } </style...缺点 存在的缺点很明显,我也很刻意的去避开,那就是代码无法换行,因为回车后,内容会新增div元素,破坏了原有的文本结构: ? ?...细心的人又发现了,我又刻意的不输入Tab制表符,是的没错,因为按Tab键会跳焦(失去焦点)!所以应该需要用脚本去处理,具体网上冲浪一大堆哈 ?

    1.7K21

    JavaScript的理解记录(5)

    5、 节点的增删:操作文档进行文档节点的增加和删除          1、创建节点:document.createElement() 参数为不区分大小写的标签名(对于HTML),对XML文档会区分大小写...第二个参数是该父节点的子节点,可以为null,为null是功能与appendChild相同;                如果使用以上两个方法再次插入已经存在的节点,已存在节点将会自动从它的当前位置删除并在新的位置从新插入...,可以用来做单页表格的排序等,不改变表格数据,只改变节点的顺序;          3、删除和替换节点:删除节点:removeChild() 替换节点:replaceChild();         ...6、HTML可编辑内容:有两种方法启用编辑功能,         其一:设置任何标签的HTML contenteditable属性;div id="editor" contenteditable>edit...div>         其二:设置对应元素的JavaScript contenteditable属性;         浏览器定义了多项文本编辑命令,为了执行这些命令,应该使用Document

    1.4K20

    161. 精读《可视化搭建思考 - 富文本搭建》

    可以看出来这是一种结合的尝试,从前端角度来看,富文本本质上是对一个 div 进行 contenteditable 申明,那么一个应用可以整体是 contenteditable 的,也可以局部几个区块是,...但对于一个提供了富文本组件的积木式搭建系统来说,文字与控件混排又是一个痛点,毕竟要以一个个区块组件的方式去拖拽文本节点,成本比富文本模式大得多。...富文本模式则类似下面的结构: div contenteditable> header footer div> 只要拖拽 bar-chart、div 两个组件即可,div 内部的文字通过光标输入,line-chart 通过富文本某个按钮或者键盘快捷键添加。...富文本组件既可以是搭建系统中一个组件,又可以在内部承载搭建系统的所有组件,做到这一步才算是真正发挥出富文本的潜力。

    1.1K10
    领券