我需要在Summernote编辑器中复制粘贴一些内容。但是当我粘贴时,它会带有我复制内容所在页面的样式。我需要以纯文本形式粘贴。有什么解决办法吗?
我需要在Summernote编辑器中复制粘贴一些内容。但是当我粘贴时,它会带有我复制内容所在页面的样式。我需要以纯文本形式粘贴。有什么解决办法吗?
onPaste
回调函数使用onPaste
选项定义一个回调函数,以剥离标签并手动插入文本。
$editor.summernote({
onPaste: function (e) {
var bufferText = ((e.originalEvent || e).clipboardData || window.clipboardData).getData('Text');
e.preventDefault();
document.execCommand('insertText', false, bufferText);
}
});
信用:https://github.com/summernote/summernote/issues/303
解决Firefox问题:
如果您仍然在使用Firefox时遇到问题,可以将document.execCommand
放在一个定时器函数中稍微延迟其执行:
setTimeout(function(){
document.execCommand( 'insertText', false, bufferText );
}, 10);
v0.7.0之后选项中回调函数的位置发生了改变。
在v0.7.0之后,每个回调函数都应该被回调对象包装。 (来源)
这意味着原始代码应该按如下方式编写:
$editor.summernote({
callbacks: {
onPaste: function (e) {
var bufferText = ((e.originalEvent || e).clipboardData || window.clipboardData).getData('Text');
e.preventDefault();
document.execCommand('insertText', false, bufferText);
}
}
});
感谢Mathieu Castets 指出(如果这部分有帮助,请点赞他的回答!)
简而言之:这是一个功能性的 演示
$('.summernote').summernote({
callbacks: {
onPaste: function (e) {
var bufferText = ((e.originalEvent || e).clipboardData || window.clipboardData).getData('Text');
e.preventDefault();
// Firefox fix
setTimeout(function () {
document.execCommand('insertText', false, bufferText);
}, 10);
}
}
});
e.preventDefault()
方法无法阻止粘贴图片内容,即使bufferText.length == 0
。 - Someone SpecialonPaste回调函数很好用,但我在不同浏览器中遇到了处理换行的问题。因此,我想出了以下解决方案,它使用html-linebreaks:
$(".htmleditor").summernote({
callbacks: {
// callback for pasting text only (no formatting)
onPaste: function (e) {
var bufferText = ((e.originalEvent || e).clipboardData || window.clipboardData).getData('Text');
e.preventDefault();
bufferText = bufferText.replace(/\r?\n/g, '<br>');
document.execCommand('insertHtml', false, bufferText);
}
}
});
我成功地为IE11制作了一个可怕的黑客工具。不幸的是,这也会要求用户粘贴权限。如果有人能想出更好的建议,我非常愿意听取。
var trap = false;
$(document).ready(function () {
$('#summernote').summernote({
callbacks: {
onPaste: function (e) {
if (document.queryCommandSupported("insertText")) {
var text = $(e.currentTarget).html();
var bufferText = ((e.originalEvent || e).clipboardData || window.clipboardData).getData('Text');
setTimeout(function () {
document.execCommand('insertText', false, bufferText);
}, 10);
e.preventDefault();
} else { //IE
var text = window.clipboardData.getData("text")
if (trap) {
trap = false;
} else {
trap = true;
setTimeout(function () {
document.execCommand('paste', false, text);
}, 10);
e.preventDefault();
}
}
}
}
})
})
$('#title').on('summernote.paste', function(e, ne) {
var bufferText = ((ne.originalEvent || ne).clipboardData || window.clipboardData).getData('Text');
ne.preventDefault();
bufferText = bufferText.replace(/\r?\n/g, '<br>');
document.execCommand('insertHtml', false, bufferText);
})
富文本编辑器的onPaste功能不完美,我们需要同时干预纯文本粘贴和HTML粘贴(pasteHTML)。我们需要将剪贴板数据中的html和body标签移除,并用span标签包裹它们。
onPaste = (e) => {
const clipboardData = ((e.originalEvent || e).clipboardData || window.clipboardData);
const isPlainTextPasting = !clipboardData.types.includes("text/html");
if (isPlainTextPasting) {
let bufferText = clipboardData.getData("Text").replace(/\r?\n/g, '<br>');
const blocksFromHTML = stateFromHTML(bufferText);
// ignore default paste, only apply for plain text paste
e.preventDefault();
setTimeout(() => {
const html = stateToHTML(blocksFromHTML);
this.editor.summernote('pasteHTML', html);
}, 10);
}
else {
let bufferText = clipboardData.getData("text/html")
// ignore default paste, only apply for plain text paste
e.preventDefault();
setTimeout(() => {
const html = bufferText.replace(/^<html>\r?\n<body>\r?\n/, "")
.replace(/\r?\n<\/body>\r?\n<\/html>$/, "")
this.editor.summernote('pasteHTML', `<span>${html}</span>`);
}, 10);
}
}
<span>
标签。之后就都是正常的了。@jcuenod - nclsvhonpaste
而不是onPaste
。6.5版本修复了此问题。 - Ross Lote