首页 > 其他分享 >vue中使用ckeditor,支持wps,word,网页粘贴

vue中使用ckeditor,支持wps,word,网页粘贴

时间:2023-10-17 12:15:36浏览次数:39  
标签:src vue word ckeditor default res loader let editor

ckeditor5官网目前不支持wps的图片粘贴,但可以通过修改源码实现。

<template>

  <div>

    <div v-if="!disabled">

      <div id="toolbar-container"></div>

      <!-- 编辑器容器 -->

      <div id="editor">

        <p>This is the initial editor content.</p>

      </div>

    </div>

    <div class="look" v-else>

      <div v-html="modelData"></div>

    </div>

  </div>

</template>

<script>

  const ZZ_HTTP = process.env.NODE_ENV === 'development' ? /^http:\/\/192.168.1.205/ : /^http:\/\/线上地址/

  let IS_UPLOAD = false

  export default {

    name: 'my-quill-edit',

    data () {

      return {

        editor: null,//编辑器实例

      };

    },

    model: {

      prop: 'modelData',

      event: 'modelChage'

    },

    props: {

      modelData: {

        type: String,

        default: ''

      },

      disabled: {

        type: Boolean,

        default: false

      }

    },

    created () {

      this.value2 = this.modelData

      setTimeout(() => {

        this.$nextTick(() => {

          this.initCKEditor()

        })

      }, 500);

    },

    mounted () {

    },

    methods: {

      initCKEditor () {

        if (this.disabled) return

        let _this = this;

        class UploadAdapter {

          constructor(loader) {

            this.loader = loader;

          }

          async upload () {

            //重置上传路径

            // let fileName = 'goods' + this.loader.file.lastModified;

            //  var fileName = 'goods' + this.loader.file.lastModified

            // 通过 FormData 对象上传文件

            let file = await this.loader.file

            return new Promise((resolve, reject) => {

              let formData = new FormData();

              formData.append('files', file);

              _this.$api.ckeditImageUpload3(formData).then(res => {

                // let resData = res[0]

                // resData.default = res[0].filePath;

                if (res) {

                  resolve({

                    default: res[0].filePath

                  });

                } else {

                  resolve({

                    default: ''

                  });

                }

              }).catch(error => {

                reject(error)

                return false

              })

            })

            // _this.$axios.post(_this.$url.uploadUrl, formData).then(rs => {

            //  if (rs) {

            //    console.log(rs.filePath);

            //  }

            // });

            // client().put(fileName, this.loader.file).then(result => {

            //  console.log(result);

            //  resolve({

            //    default: result.url

            //  })

            // }).catch(err => {

            //  console.log(err)

            // })

          }

          abort () {

          }

        }

        ClassicEditor.create(document.querySelector('#editor'), {

          ckfinder: {

            // uploadUrl: this.$url.uploadUrl

            //后端处理上传逻辑返回json数据,包括uploaded(选项true/false)和url两个字段

          }

        }).then(editor => {

          const toolbarContainer = document.querySelector('#toolbar-container');

          toolbarContainer.appendChild(editor.ui.view.toolbar.element);

          // 加载适配器

          editor.plugins.get('FileRepository').createUploadAdapter = (loader) => {

            return new UploadAdapter(loader);

          }

          this.editor = editor //将编辑器保存起来,用来随时获取编辑器中的内容等,执行一些操作

          editor.setData(this.modelData || '')

          editor.model.document.on('change:data', (eventInfo, name, value, oldValue) => {

            // this.value = this.editor.getData()

            this.handleImage(this.editor.getData())

            this.$emit('modelChage', this.editor.getData())

          });

        }).catch(error => {

          console.error(error);

        });

      },

      handleImage (val) {

        var imgReg = /<img.*?(?:>|\/>)/gi

        var srcReg = /src=[\'\"]?([^\'\"]*)[\'\"]?/i

        var arr = val.match(imgReg)

        let array = []

        if (arr) {

          for (var i = 0; i < arr.length; i++) {

            var src = arr[i].match(srcReg)

            // 获取图片地址

            if (!src) return false

            if (src && src[1] && !src[1].match(ZZ_HTTP)) {

              array.push(src[1])

            }

          }

        }

        if (array[0]) {

          this.uploadImage(array)

        }

      },

      uploadImage (array) {

        this.$api.ckeditImageUpload({ urlList: array }).then(res => {

          if (res) {

            let newVal = this.editor.getData()

            let str = ''

            res.forEach(item => {

              newVal = newVal.replace(item.oldUrl, item.newUrl)

            })

            // this.editor.destroy(true);//销毁编辑器

            this.editor.setData(newVal)

          }

        })

      }

    }

  }

</script>

<style lang="less">

  .ck.ck-editor__editable_inline {

    max-height: 500px !important;

    overflow-x: hidden !important;

  }

</style>

<style lang="less" scoped>

  #editor .ck-blurred.ck {

    height: 400px;

  }

  .look {

    max-height: 500px;

    overflow-x: hidden;

  }

</style>


参考文章:http://blog.ncmem.com/wordpress/2023/10/17/vue%e4%b8%ad%e4%bd%bf%e7%94%a8ckeditor%e6%94%af%e6%8c%81wpsword%e7%bd%91%e9%a1%b5%e7%b2%98%e8%b4%b4-3/

欢迎入群一起讨论

 



标签:src,vue,word,ckeditor,default,res,loader,let,editor
From: https://www.cnblogs.com/songsu/p/17769368.html

相关文章

  • window对象和vuex
    保存在window对象中可以作为全局组件通信的媒介,不过这种方式不具备响应性能力,所以数据更时无法直接通知订阅数据的组件更新。使用vuex.保存数据与window保存的原理一样,都是借助了全局对象进行数据互通,不同的是vuex通过订阅发布机制可以将vue数据的更新通知到所有订阅状态的组件......
  • Vue性能优化--在Vue中,千万别用属性数组作为循环的对象
    在Vue中,千万别用属性数组作为循环的对象methods:{test(){...上面省略业务逻辑1万字 //16位像素数组letdcmbuffer=newUint16Array(dcmInfo._dictionary.dict["7FE00010"].Value[0]asArrayBuffer);this.currentImageInfo={......
  • vue2 + websocket 断线重连 + 实时数据
    一、websocket事件-1打开事件Socket.onopen连接建立时触发-2消息事件Socket.onmessage客户端接收服务端数据时触发-3错误事件Socket.onerror通信发生错误时触发-4关闭事件Socket.onclose连接关闭时触发二、webs......
  • 24-Vue组件化编程-单文件组件
    单文件组件一个文件中只包含有1个组件 组件名的注意事项一个单词组成:1)第一种写法(首字母小写):school2)第二种写法(首字母大写):School,推荐多个单词组成:1)第一种写法(kebab-case命名):my-school2)第二种写法(CamelCase命名):MySchool,推荐 创建一个school.vue文件,通常含有以下三种标签......
  • vue3中引入elementplus以及图标(vue3+vuecli)
    开发背景nodev18.17.0(node-v)npmv8.4.1(npm-v)@vue/cli5.0.8(vue-V)0.用命令行安装elementPlusnpminstallelement-plus--save1.elementplus按需手动导入ElementPlus组件很多,如果导入组件太多,为了更好的管理ElementPlus组件,可将组件作为独立的文件,将不同功能逻辑......
  • 记录--Vue中前端导出word文件
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助很多时候在工作中会碰到完全由前端导出word文件的需求,因此特地记录一下比较常用的几种方式。一、提供一个word模板该方法提供一个word模板文件,数据通过参数替换的方式传入word文件中,灵活性较差,适用于简单的文件导......
  • vue父组件如何获取子组件的ref
    可以在父组件的mounted钩子函数中获取子组件的ref,然后调用子组件的方法来设置当前节点,代码如下://父组件代码<template><SideBarref="sidebar"/></template><script>exportdefault{mounted(){this.$nextTick(()=>{//获取子组件tree的ref......
  • vue 手机规则校验
    一、背景点击查看代码phone:[{required:true,message:'请输入手机号',trigger:'blur'},{min:11,max:11,message:'手机号位数不对',trigger:'blur'},{pattern:/^(13[0-9]|14[579]|15[0-3,5-9]|16......
  • 第二十一篇 - vue中实现页面刷新以及局部刷新的方法
    参考链接:https://blog.csdn.net/qq_41117240/article/details/127275478第一步:在需要局部刷新的标签添加 第二步:在data里面初始化isRefresh的值为true 第三步:在method里面添加刷新函数 第四步:在需要局部刷新的地方调用刷新函数this.updateRefresh()......
  • Word标题编号转换为纯文本
    一、创建宏这个要用到宏命令打开Word文档,按下快捷键Alt+F8,在“宏名”栏中输入“编号转换为文本”,这是给它起的名字,然后点击“创建”在新打开的窗口上,你会看到光标在闪烁,把下面函数中的4行内容复制粘贴到此处。Sub编号转纯文本()DimkgslistAsListForEachkgslistInAc......