javascript - 如何防止 contenteditable div 呈现 html?

标签 javascript html css

这是我的代码:https://jsfiddle.net/tb8ryyp6/1/

如您所见,如果我们将图像拖放到 contenteditable div 中,其内容将呈现为 HTML。我想阻止这种行为。目前我通过将事件处理程序附加到 contenteditable div on drop 事件解决了这个问题,就像这样 ondrop='return false;'

这对我有用。

<div contenteditable='true' ondrop='return false;'>

但是。这个解决方案似乎不是一个跨浏览器的解决方案,用户可以随时通过更改开发工具中的 HTML 源代码轻松地删除这个偶数处理程序。

一般来说,我想阻止内容可编辑的 div 呈现任何 HTML 元素。这个元素不仅可以是图像,还可以是 anchor 元素。作为解决方案,它既可以是跨浏览器防止拖放操作,也可以将 HTML 显示为文本。但第一个更好。

感谢您的帮助!

最佳答案

在大多数情况下,您可以设计一个 <textarea>就像其他任何东西一样。但是你想要的也可以用<div contenteditable>来完成。 .

user can remove this even handler at any time by changing html source code in dev-tools.

如果您使用 addEventListener("drop", func) ,事件监听器在 html 代码中不可见。虽然它仍然可以被删除,但是如果网站不再正常工作就不是你的问题了(它只是在浏览器中发生了变化,而不是在服务器上发生了变化!)

此代码使用 innerText属性(包含未格式化的文本)。由于换行符是 \ninnerText<br><div> , 它必须转换。

var ediv = document.getElementById("ediv");

function noHTML() {
    setTimeout(function() {
        var str1 = ediv.innerText.replace(/\n/g,"");
        var str2 = ediv.innerHTML.replace(/<br>/g,"");
        
        if (str1 != str2) {
            ediv.innerText = ediv.innerText;
        }
    }, 1);
}

// Remove markup when dropping something (e.g. image/ link)
ediv.addEventListener("drop", noHTML);
// Remove markup when pasting something (e.g. from Microsoft Word)
ediv.addEventListener("paste", noHTML);
// Remove markup from the clipboard when copying something
ediv.addEventListener("copy", function(e) {
    noHTML();
    if (e.clipboardData) {
        var text = window.getSelection().toString();
        e.preventDefault();
        e.clipboardData.setData('Text', text);
    }
});
// Remove markup when the div gains focus
ediv.addEventListener("focus", noHTML);
// Remove markup when the div loses focus
ediv.addEventListener("blur", noHTML);
#ediv{
  background-color: white;
  height: 70px;
  border: 2px dotted blue; 
  margin-bottom: 20px;
  padding: 10px;
}
[placeholder]:empty:before {
    content: attr(placeholder);
    color: #ddd; 
}
[placeholder]:empty:focus:before {
    content: "";
}
#img {
  text-align: center;
}
<div id='ediv' contenteditable='true' placeholder='i am contenteditable div..'></div>

<div id='img'>
  <span>drag and drop this image to contenteditable div</span>
  <br>
  <img src='https://upload.wikimedia.org/wikipedia/commons/4/4d/Cat_March_2010-1.jpg' width='220px'><br>
  <a href='https://upload.wikimedia.org/wikipedia/commons/4/4d/Cat_March_2010-1.jpg'>Hyperlink</a>
</div>

Updated Fiddle

关于javascript - 如何防止 contenteditable div 呈现 html?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38447285/

相关文章:

javascript - jqGrid 覆盖禁用我页面的其余部分

css - 获取 2 图像垂直对齐

Javascript数组id显示顺序

javascript - 相互依赖的组件需要相互通信

html - 尝试将我的 <h1> 和 <p> 元素对齐在我的图像左侧

javascript - 在点之间移动图像

html - 为什么div重叠

javascript - 如何从 javascript 中的字符串中删除尾随的某些空白 block ?

javascript - JS - 将数组中的唯一列与重复项连接起来

javascript - 在新窗口中突出显示文本