javascript - 如何防止从编辑的时候?
问题描述
如何防止用户在编辑期间删除 <div contenteditable> 编辑器中的 <section>(至少通过按“Delete”/“Backspace”键)?
<html>
<head>
<title>Parcel Sandbox</title>
<meta charset="UTF-8" />
<style>
#editor {
width: 100%;
height: 300px;
border: 1px black solid;
}
#dont-remove-me-please{
width: 100%;
height: 100px;
border: 1px red dashed;
font-weight: bold;
user-select: none;
}
</style>
</head>
<body>
<div id="app"></div>
<div contenteditable="true" id="editor">
<div>hey guys!</div>
<div><strong>more text...</strong></div>
<section id="dont-remove-me-please" contenteditable="false">DONT' REMOVE ME!!!</section>
<div><br></div>
</div>
<script>
document.getElementById('editor').focus()
</script>
</body>
</html>
谢谢你。
解决方案
您可以设置contenteditable=false
为子项以防止它们可编辑。
但是,如果您仍然希望子元素是可编辑的,但子 dom 元素不应该是可移除的,我认为您需要监听退格/删除事件并查看这些对 dom 的影响,并在它们移除 dom 节点时撤消更改。试图自己解决这个问题
编辑:这就是我所做的
function onpaste(e: ClipboardEvent) {
e.preventDefault();
const selection = window.getSelection();
// Don't allow deleting nodes
if (selection.anchorNode.isSameNode(selection.focusNode)) {
// get text representation of clipboard
const text = e.clipboardData.getData("text/plain");
// insert text manually, but without new line characters as can't support <br/>s yet
document.execCommand("insertHTML", false, text.replace(/\n/g, ""));
}
}
function onkeydownInEditable(e: KeyboardEvent) {
if (e.key === "Enter") {
e.preventDefault();
}
if (e.key === "Backspace" || e.key === "Delete" || e.key === "Paste") {
const selection = window.getSelection();
// Don't allow deleting nodes
if (!selection.anchorNode.isSameNode(selection.focusNode))
e.preventDefault();
}
}
elementEditing.addEventListener("keydown", onkeydownInEditable);
elementEditing.addEventListener("paste", onpaste);
推荐阅读
- css - 背景图像悬停时的线性渐变
- javascript - JavaScript 一个接一个地运行一个函数
- swift - ARKit 将 ARFaceAnchor.lookAtPoint 转换为世界坐标
- javascript - 无服务器自定义授权器结果未定义
- hostname - 什么以及为什么我的 $HOSTNAME 是 hitronhub.home?
- excel - 我可以使用任何公式/方法将 A 列中的每一行与 B 列中的每一行连接起来吗?
- android - 当滚动超出最初可见的内容时,无法在回收站视图中访问文本视图
- asp.net-mvc - 如何解决“/”应用程序中的服务器错误
- python - 如何将布尔张量打包成 int32 张量的位?
- swift - 如何通过 urlsession 更新 uitableview 单元格中的进度视图(下载/上传文件)