基于summernote的富文本编辑器,粘贴时去除word格式

2 篇文章 0 订阅
0 篇文章 0 订阅

在使用summernote的富文本编辑器,在粘贴word内容时,会发现代码中有很多无效的代码。通过js处理,可以去掉很多无用的代码。

处理前,粘贴后的代码类似这样:

<p><!--[if !mso]>
<style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]--><!--[if gte mso 9]><xml>
 <o:OfficeDocumentSettings>
  <o:AllowPNG></o:AllowPNG>
 </o:OfficeDocumentSettings>
</xml><![endif]--><!--[if gte mso 9]><xml>
 <w:WordDocument>

。。。。。

处理以后,这些无效的代码都可以去除。两种处理方法:

方法1:

在summernote的onPaste事件中处理。js如下:

$('#summernote').summernote({
                    callbacks: {
                        onPaste: function (ne) {
                           var bufferText = ((ne.originalEvent || ne).clipboardData || window.clipboardData).getData('Text/plain');
                            //    ne.preventDefault();  
                            ne.preventDefault ? ne.preventDefault() : (ne.returnValue = false);
                            // Firefox fix
                            setTimeout(function () {
                                document.execCommand("insertText", false, bufferText);
                            }, 10);
                           /*  */
                        }
                    }

                });
以上代码在win10下ie11和firefox49中测试通过。

其中要点:

getData('Text/plain'),这里一定要加上plain(不知原因),否则,ie11不能粘贴,而FF、Edge则正常。 

另外奇怪的地方,ie11可以粘贴过来图形,而FF和Edge却不行。莫名其妙。

========================

方法2:

通过js方法处理。添加summernote自定义按钮,自定义按钮事件,使用js方法有效去除庸余代码,此方法效果好于上述方法。此方法在IE11下测试通过。

            // custom button
            var EmptyButton = function (context) {
                var ui = $.summernote.ui;
                var button = ui.button({
                    contents: '<i class="note-icon-trash"/>',
                    tooltip: '清除全部内容',
                    click: function () {
                        context.invoke('editor.empty');
                    }
                });
                return button.render();
            };
            var CleanWordButton = function (context) {
                var ui = $.summernote.ui;
                var button = ui.button({
                    contents: '<i class="note-icon-square"/>',
                    tooltip: '清除Word格式',
                    click: function () {
                        //  清除img的wrap元素
                        var str = context.invoke('code');
                        str = CleanPastedHTML(str); //  class="hidden"
                        $('.container').append('<div id="tmp">' + str + '</div>');
                        $('#tmp table img').unwrap( );
                        str = $('#tmp').html();
                        str = CleanPastedHTML(str); //  class="hidden"
                        $('#tmp').remove();
                        context.invoke('code', str);
                    }
                });
                return button.render();
            };
            $(document).ready(function () {
                $('.summernote').summernote({
                    lang: 'zh-CN',
                    height: 500,
                    minHeight: 240, // set minimum height of editor
                    // maxHeight: null, // set maximum height of editor
                    focus: true, // set focus to editable area after initializing su 
                    dialogsInBody: true,
                    dialogsFade: true, // Add fade effect on dialogs,
                    disableDragAndDrop: true,
                    shortcuts: true,
                    placeholder: '在这里添加内容',
                    toolbar: [
                        ['style', ['clear', 'bold', 'italic', 'underline', 'word']],
                        ['font', ['fontname', 'fontsize', 'strikethrough', 'superscript', 'subscript']],
                        ['color', ['color']],
                        ['para', ['ul', 'ol', 'paragraph', 'style', 'height']],
                        ['insert', ['table', 'picture', 'hr']],
                        ['mybutton', ['empty', 'undo', 'redo']],
                        ['misc', ['fullscreen', 'codeview', 'help']]
                    ],
                    buttons: {empty: EmptyButton, word: CleanWordButton}
                });
                $('.note-group-image-url').hide(); // 隐藏img url   
                $('.summernote').summernote('code', '<p><br></p>');
                $('.summernote').summernote('focus');
                $('.summernote').summernote('fullscreen.toggle');
            });

function CleanPastedHTML(input) {
  // 1. remove line breaks / Mso classes
  var stringStripper = /(\n|\r| class=(")?Mso[a-zA-Z]+(")?)/g;
  var output = input.replace(stringStripper, ' ');
  // 2. strip Word generated HTML comments
  var commentSripper = new RegExp('<!--(.*?)-->','g');
  var output = output.replace(commentSripper, '');
  var tagStripper = new RegExp('<(/)*(meta|link|span|\\?xml:|st1:|o:|font)(.*?)>','gi');
  // 3. remove tags leave content if any
  output = output.replace(tagStripper, '');
  // 4. Remove everything in between and including tags '<style(.)style(.)>'
  var badTags = ['style', 'script','applet','embed','noframes','noscript'];

  for (var i=0; i< badTags.length; i++) {
    tagStripper = new RegExp('<'+badTags[i]+'.*?'+badTags[i]+'(.*?)>', 'gi');
    output = output.replace(tagStripper, '');
  }
  // 5. remove attributes ' style="..."'
  var badAttributes = ['style', 'start'];
  for (var i=0; i< badAttributes.length; i++) {
    var attributeStripper = new RegExp(' ' + badAttributes[i] + '="(.*?)"','gi');
    output = output.replace(attributeStripper, '');
  }
  return output;
} 


  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Tinymce提供了一些配置选项,可以实现从Word中复制粘贴内容并保留格式和图片的功能。具体实现步骤如下: 1. 加载tinymce的源文件和plugins目录下的插件文件。例如: ```html <script src="/path/to/tinymce.min.js"></script> <script src="/path/to/plugins/paste/plugin.min.js"></script> <script src="/path/to/plugins/paste/plugin.min.js"></script> ``` 2. 设置tinymce的选项,包括使用的主题、插件和工具栏等。例如: ```javascript tinymce.init({ selector: 'textarea', plugins: 'paste image', toolbar: 'undo redo | bold italic | image', paste_data_images: true, images_upload_url: '/path/to/upload', images_upload_handler: function (blobInfo, success, failure) { // 处理图片上传 } }); ``` 其中,paste_data_images选项用于启用从Word粘贴图片的功能,images_upload_url和images_upload_handler用于处理上传的图片。 3. 在服务器端处理上传的图片,并返回图片的URL地址。例如,使用PHP实现图片上传功能: ```php <?php if ($_FILES['file']['error'] === UPLOAD_ERR_OK) { $file_tmp = $_FILES['file']['tmp_name']; $file_name = $_FILES['file']['name']; $file_ext = pathinfo($file_name, PATHINFO_EXTENSION); $file_path = '/path/to/images/' . uniqid() . '.' . $file_ext; move_uploaded_file($file_tmp, $file_path); echo json_encode(['location' => $file_path]); } else { echo json_encode(['error' => '上传失败']); } ``` 以上就是使用Tinymce实现从Word中复制粘贴内容并保留格式和图片的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值