需求是这样的,录入内容时,大多是从 Word 中粘贴过来的,内容很少,但实际代码却很多,存储时,提示保存失败。
最简单的方法是调整数据库字段长度,但这样不是最好的解决方法。
留意,必须在,/addons/summernote/bootstrap.js 文件中,增加内容,否则在 FastAdmin 后台清除插件缓存后,/public/assets/js/addons.js 会被覆盖!
另一种方式是通过对 Summernote 修改,实现粘贴即去除格式,或者,通过点击按钮去除格式。(插件自带的清除格式按钮,效果不是很好)。
方法一、粘贴后自动清除格式
在 /addons/summernote/bootstrap.js 文件中,增加函数:
// 清理粘贴的内容 function CleanPastedHTML(input) { let i; // 1. 移除换行符 和 Mso 类 const stringStripper = /(\n|\r| class=(")?Mso[a-zA-Z]+(")?)/g; let output = input.replace(stringStripper, ' '); // 2. Word 脚本生成的 HTML 注释 const commentStripper = new RegExp('<!--(.*?)-->', 'g'); output = output.replace(commentStripper, ''); let tagStripper = new RegExp('<(/)*(meta|link|span|\\?xml:|st1:|o:|font|b|i|strong|u|strike)(.*?)>', 'gi'); // 3. 如果有内容则删除标签 output = output.replace(tagStripper, ''); // 4. 移除所有内容,像 '<style(.)style(.)>' const badTags = ['style', 'script', 'applet', 'embed', 'noframes', 'noscript']; for (i = 0; i< badTags.length; i++) { tagStripper = new RegExp('<'+badTags[i]+'.*?'+badTags[i]+'(.*?)>', 'gi'); output = output.replace(tagStripper, ''); } // 5. 移除属性,如 ' style="..."' const badAttributes = ['style', 'start']; for (i = 0; i< badAttributes.length; i++) { const attributeStripper = new RegExp(' ' + badAttributes[i] + '="(.*?)"', 'gi'); output = output.replace(attributeStripper, ''); } return output; }
及在这个文件中,搜索 callback ,并增加以下:
(可以不使用 bufferText = CleanPastedHTML(bufferText);,只做简单清理)
onPaste: function (ne) { let bufferText = ((ne.originalEvent || ne).clipboardData || window.clipboardData).getData('Text/plain'); bufferText = CleanPastedHTML(bufferText); ne.preventDefault ? ne.preventDefault() : (ne.returnValue = false); setTimeout(function () { document.execCommand("insertText", false, bufferText); }, 10); },
方法二:手动清除格式
即,增加按钮,点击后清除格式。仍是在 /addons/summernote/bootstrap.js 文件中,增加函数:
// 自定义 清除格式按钮 const CleanWordButton = function (context) { const ui = $.summernote.ui; const button = ui.button({ contents: '<i class="note-icon-eraser"/>', tooltip: '清除格式', click: function () { // 清除img的wrap元素 let str = context.invoke('code'); str = CleanPastedHTML(str); context.invoke('code', str); } }); return button.render(); };
及搜索 toolbar 并增加 word 项,及在 buttons 中定义 word 按钮要执行方法:
toolbar: [ ['view', ['fullscreen', 'codeview', 'word', 'help']], ], buttons: { image: imageButton, attachment: attachmentButton, word: CleanWordButton },
至此完成。
参考资料: