我有一个基于execCommand这里介绍的示例的基本编辑器。可通过三种方式在execCommand区域内粘贴文本:
- Ctrl+V
- 右键单击 -> 粘贴
- 右键单击 -> 粘贴为纯文本
我想只允许粘贴没有任何 HTML 标记的纯文本。如何强制前两个操作粘贴纯文本?
可能的解决方案:我能想到的方法是为 ( Ctrl+ V) 的keyup 事件设置侦听器并在粘贴之前去除 HTML 标签。
- 这是最好的解决方案吗?
- 避免粘贴任何 HTML 标记是否防弹?
- 如何将侦听器添加到右键单击-> 粘贴?
我有一个基于execCommand这里介绍的示例的基本编辑器。可通过三种方式在execCommand区域内粘贴文本:
我想只允许粘贴没有任何 HTML 标记的纯文本。如何强制前两个操作粘贴纯文本?
可能的解决方案:我能想到的方法是为 ( Ctrl+ V) 的keyup 事件设置侦听器并在粘贴之前去除 HTML 标签。
它将拦截paste事件,取消paste,并手动插入剪贴板的文本表示:
http : //jsfiddle.net/HBEzc/。这应该是最可靠的:
不过,我不确定是否支持跨浏览器。
editor.addEventListener("paste", function(e) {
// cancel paste
e.preventDefault();
// get text representation of clipboard
var text = (e.originalEvent || e).clipboardData.getData('text/plain');
// insert text manually
document.execCommand("insertHTML", false, text);
});
我无法在这里获得可接受的答案以在 IE 中工作,所以我进行了一些侦察并得出了这个适用于 IE11 以及最新版本的 Chrome 和 Firefox 的答案。
$('[contenteditable]').on('paste', function(e) {
e.preventDefault();
var text = '';
if (e.clipboardData || e.originalEvent.clipboardData) {
text = (e.originalEvent || e).clipboardData.getData('text/plain');
} else if (window.clipboardData) {
text = window.clipboardData.getData('Text');
}
if (document.queryCommandSupported('insertText')) {
document.execCommand('insertText', false, text);
} else {
document.execCommand('paste', false, text);
}
});
作为 pimvdb 的紧密解决方案。但它适用于 FF、Chrome 和 IE 9:
editor.addEventListener("paste", function(e) {
e.preventDefault();
if (e.clipboardData) {
content = (e.originalEvent || e).clipboardData.getData('text/plain');
document.execCommand('insertText', false, content);
}
else if (window.clipboardData) {
content = window.clipboardData.getData('Text');
document.selection.createRange().pasteHTML(content);
}
});
当然,这个问题已经回答了,而且这个话题很老了,但我想提供我的解决方案,因为它很简单:
这是在我的 contenteditable-div 上的粘贴事件中。
var text = '';
var that = $(this);
if (e.clipboardData)
text = e.clipboardData.getData('text/plain');
else if (window.clipboardData)
text = window.clipboardData.getData('Text');
else if (e.originalEvent.clipboardData)
text = $('<div></div>').text(e.originalEvent.clipboardData.getData('text'));
if (document.queryCommandSupported('insertText')) {
document.execCommand('insertHTML', false, $(text).html());
return false;
}
else { // IE > 7
that.find('*').each(function () {
$(this).addClass('within');
});
setTimeout(function () {
// nochmal alle durchlaufen
that.find('*').each(function () {
// wenn das element keine klasse 'within' hat, dann unwrap
// http://api.jquery.com/unwrap/
$(this).not('.within').contents().unwrap();
});
}, 1);
}
其他部分来自另一个我找不到的SO帖子......
2014 年 11 月 19 日更新: 另一个 SO-post
发布的答案似乎都没有真正适用于跨浏览器,或者解决方案过于复杂:
insertTextIE 不支持该命令paste在 IE11 中使用该命令导致堆栈溢出错误对我有用的(IE11、Edge、Chrome 和 FF)如下:
$("div[contenteditable=true]").off('paste').on('paste', function(e) {
e.preventDefault();
var text = e.originalEvent.clipboardData ? e.originalEvent.clipboardData.getData('text/plain') : window.clipboardData.getData('Text');
_insertText(text);
});
function _insertText(text) {
// use insertText command if supported
if (document.queryCommandSupported('insertText')) {
document.execCommand('insertText', false, text);
}
// or insert the text content at the caret's current position
// replacing eventually selected content
else {
var range = document.getSelection().getRangeAt(0);
range.deleteContents();
var textNode = document.createTextNode(text);
range.insertNode(textNode);
range.selectNodeContents(textNode);
range.collapse(false);
var selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
}
};
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<textarea name="t1"></textarea>
<div style="border: 1px solid;" contenteditable="true">Edit me!</div>
<input />
</body>
请注意,自定义粘贴处理程序只需要/为contenteditable节点工作。由于字段textarea和普通input字段根本不支持粘贴 HTML 内容,因此此处无需执行任何操作。