我正在尝试创建一个只接受纯文本的可编辑内容。
我想要的是监听粘贴事件,然后删除所有HTML并将其作为纯文本粘贴到可编辑内容中。
为了做到这一点,我已经尝试了两种不同的方法,基于类似问题的答案,但这两种方法都存在问题。
第一种方法: 这种方法没有使用“粘贴”侦听器,而是侦听输入(不适用于此情况),这是避免使用 Clipboard API 的解决方案。
问题: 这在Chrome上运行良好,但在Firefox和IE上不行,当您复制和粘贴HTML时,它成功地删除了HTML并仅粘贴了文本,但在继续编写文本时,插入符号始终被带到可编辑内容的开头。
function convertToPlaintext() {
var textContent = this.textContent;
this.textContent = textContent;
}
var contentEditableNodes = document.querySelectorAll('.plaintext[contenteditable]');
[].forEach.call(contentEditableNodes, function(div) {
div.addEventListener("input", convertToPlaintext, false);
});
您可以在此处尝试基于以下代码: http://jsbin.com/moruseqeha/edit?html,css,js,output
第二步: 由于第一个方法失败并且仅侦听“粘贴”事件,因此我决定尝试使用Clipboard API。 问题在于,在IE上,document.execCommand(“insertHTML”,false,text); 似乎无法工作。 这适用于Chrome,Firefox(在v41和v42上测试)和Edge。
document.querySelector(".plaintext[contenteditable]").addEventListener("paste", function(e) {
e.preventDefault();
var text = "";
if (e.clipboardData && e.clipboardData.getData) {
text = e.clipboardData.getData("text/plain");
} else if (window.clipboardData && window.clipboardData.getData) {
text = window.clipboardData.getData("Text");
}
document.execCommand("insertHTML", false, text);
});
你可以在这里尝试: http://jsfiddle.net/marinagon/461uye5p/
有人能帮我找到解决这些问题的办法吗?还是有比这里介绍的更好的解决方案吗?
我知道我可以使用textarea,但我有我的理由不使用它。
ev.clipboardData
未设置时,还需检查else if(ev.originalEvent.clipboardData...)
。 - Darren Cookfunction blockDragDrop(ev) { ev.dataTransfer.effectAllowed = 'none'; ev.dataTransfer.dropEffect = 'none'; ev.preventDefault(); return false; } el.addEventListener('dragstart', blockDragDrop); el.addEventListener('dragover', blockDragDrop);
(如果需要,不要忘记提供删除事件的方法) - Kris Reeves"<textarea></textarea>"
粘贴到您提供的fiddle中,它会显示文本区域。我不知道是否还有其他HTML元素可以作为HTML粘贴,没有进一步检查。” - Paul Roub