[英]How to prevent removing "section" from <div contenteditable> when editing?
如何防止用户在编辑期间删除 <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
设置为 children 以防止它们被编辑。
但是,如果您仍然希望子项可编辑但子 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);
为了达到预期的结果,使用下面的点击事件监听器并根据 id 添加 contenteditable 属性
<script>
document.getElementById('editor').addEventListener('click', function(e) {
if(e.target.id !=="dont-remove-me-please"){
e.target.setAttribute("contentEditable", true);
}
}, false);
</script>
代码示例 - https://codesandbox.io/s/rypy7wkn5m
<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 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> <script> document.getElementById('editor').addEventListener('click', function(e) { if(e.target.id !=="dont-remove-me-please"){ e.target.setAttribute("contentEditable", true); } }, false); </script> </body> </html>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.