Vue使用富文本编辑器Vue-Quill-Editor(含图片自定义上传服务、清除复制粘贴样式等)


Posted in Javascript onMay 15, 2020

使用教程(注意细看总结部分,写了几点,希望有所帮助):
1、安装插件:npm install vue-quill-editor
2、安装插件依赖:npm install quill
3、main.js文件中引入:

import Vue from 'vue'
import VueQuillEditor from 'vue-quill-editor'

import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'

Vue.use(VueQuillEditor)
new Vue({
 VueQuillEditor,
 render: h => h(App),
}).$mount('#app')

4、vue页面中使用(代码完整,复制就能使用):

<template>
 <div id="quillEditorId">
  <el-upload
   class="avatarUploader"
   action="https://jsonplaceholder.typicode.com/posts/"
   :show-file-list="false"
   :on-success="handleAvatarSuccess"
   :before-upload="beforeAvatarUpload"
  >
   <img v-if="imageUrl" :src="imageUrl" class="avatar" />
   <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  </el-upload>
  <quill-editor
   id="myQuillEditorId"
   ref="myQuillEditor"
   v-model="ruleForm.editeContent"
   :options="editorOption"
   @change="handelEditorChange($event)"
  >
  </quill-editor>
 </div>
</template>
<script>
const toolbarOptions = [
 ['bold', 'italic', 'underline', 'strike'], //加粗,斜体,下划线,删除线
 ['blockquote', 'code-block'], //引用、代码块儿
 [{ header: 1 }, { header: 2 }], //标题,键值对的形式;1、2表示字体大小
 [{ list: 'ordered' }, { list: 'bullet' }], //列表
 [{ script: 'sub' }, { script: 'super' }], //上下标
 [{ indent: '-1' }, { indent: '+1' }], //缩进
 [{ direction: 'rtl' }], //文本方向
 [{ size: ['small', false, 'large', 'huge'] }], //字体大小
 [{ header: [1, 2, 3, 4, 5, 6, false] }], //几级标题
 [{ color: [] }, { background: [] }], //字体颜色,字体背景颜色
 [{ font: [] }], //字体
 [{ align: [] }], //对齐方式
 ['clean'], //清除字体样式
 ['image'], //上传图片、上传视频(video)、超链接(link)
]
export default {
 data() {
  return {
   imageUrl: '',
   editeContent: '',
   editorOption: {
    modules: {
     clipboard: {
      // 粘贴版,处理粘贴时候的自带样式
      matchers: [[Node.ELEMENT_NODE, this.HandleCustomMatcher]],
     },
     toolbar: {
      container: toolbarOptions, // 工具栏
      handlers: {
       image: function(value) {
        if (value) {
         // 获取隐藏的上传图片的class,不一定是.el-icon-plus。触发上传图片事件
         document.querySelector('.el-icon-plus').click()
        } else {
         this.quill.format('image', false)
        }
       },
      },
     },
    },
    placeholder: '',
   },
  }
 },
 computed: {},
 async mounted() {},
 methods: {
  handleAvatarSuccess(res, file) {
   // 图片上传成功后的回调
   console.log(res, file)
  },
  beforeAvatarUpload(data) {
   // 思路:上传图片至服务后,拿到返回的图片地址。直接创建image标签插入光标所在的位置
   // 图片上传服务(本地服务或者阿里云服务)
   // 获取富文本组件实例
   let quill = this.$refs.myQuillEditor.quill
   // 上传服务成功后,按根据光标位置把图片插入编辑器中
   if (data.url) {
    // 获取光标所在位置,data.url表示上传服务后返回的图片地址
    let length = quill.getSelection().index
    // 插入图片,data.url为服务返回的图片链接地址
    quill.insertEmbed(length, 'image', data.url)
    // 调整光标到最后
    quill.setSelection(length + 1)
   } else {
    this.$message.closeAll()
    this.$message.error('图片插入失败')
   }
  },
  handelEditorChange(el) {
   console.log(el, 'el')
  },
  HandleCustomMatcher(node, Delta) {
   // 文字、图片等,从别处复制而来,清除自带样式,转为纯文本
   let ops = []
   Delta.ops.forEach(op => {
    if (op.insert && typeof op.insert === 'string') {
     ops.push({
      insert: op.insert,
     })
    }
   })
   Delta.ops = ops
   return Delta
  },
 },
}
</script>
<style scoped lang="scss">
#quillEditorId {
 .avatarUploader {
  display: none; // 隐藏上传图片组件
 }
}
</style>

总结:

1、变量toolbarOptions表示自定义的工具栏,可以参照官网(官网写的比较简单)或者细看本文代码(有详细注释);
2、如果不单独处理图片,图片会被直接转义成base64,跟随DOM一块儿上传服务;
3、本文对图片做了自定义处理,选择本地图片时,会单独上传到服务,返回地址后,直接插入到富文本编辑中的当前节点。看代码中editorOption的handlers的image函数,以及插入富文本编辑器当前光标函数beforeAvatarUpload,代码中有详细注释;
4、粘贴板,变量clipboard。如果需要清理复制的自带样式,使用粘贴板进行清理,函数HandleCustomMatcher;
5、对于复制粘贴的情况,多说一句。过程中,编辑器已经将原有的DOM转为编辑器允许存在的DOM元素,所以这块儿不用再处理(处理起来,也会有点复杂)。

到此这篇关于Vue使用富文本编辑器Vue-Quill-Editor(含图片自定义上传服务、清除复制粘贴样式等)的文章就介绍到这了,更多相关vue富文本编辑器Vue-Quill-Editor内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript call方法使用说明
Jan 11 Javascript
表单验证的完整应用案例探讨
Mar 29 Javascript
jquery实现可横向和竖向展开的动态下滑菜单效果
Aug 24 Javascript
JavaScript Promise 用法
Jun 14 Javascript
JS中用try catch对代码运行的性能影响分析
Dec 26 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
Jan 11 Javascript
JavaScript实现微信红包算法及问题解决方法
Apr 26 Javascript
详解JS函数stack size计算方法
Jun 18 Javascript
jQuery实现侧边栏隐藏与显示的方法详解
Dec 22 jQuery
JS实现图片轮播效果实例详解【可自动和手动】
Apr 04 Javascript
JavaScript进制转换实现方法解析
Jan 18 Javascript
vue setInterval 定时器失效的解决方式
Jul 30 Javascript
用Angular实现一个扫雷的游戏示例
May 15 #Javascript
Node.js API详解之 dns模块用法实例分析
May 15 #Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
May 15 #Javascript
js实现简单贪吃蛇游戏
May 15 #Javascript
Javascript执行流程细节原理解析
May 14 #Javascript
使用npm命令提示: 'npm' 不是内部或外部命令,也不是可运行的程序的处理方法
May 14 #Javascript
javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
May 14 #Javascript
You might like
Laravel 5框架学习之Eloquent (laravel 的ORM)
2015/04/08 PHP
Smarty高级应用之缓存操作技巧分析
2016/05/14 PHP
php微信开发之批量生成带参数的二维码
2016/06/26 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
2019/10/24 PHP
怎么用javascript进行拖拽
2006/07/20 Javascript
JQuery 常用方法基础教程
2009/02/06 Javascript
Jquery 常用方法经典总结
2010/01/28 Javascript
侧栏跟随滚动的简单实现代码
2013/03/18 Javascript
jQuery根据ID、CLASS、等获取对象的实例
2016/12/04 Javascript
原生js实现节日时间倒计时功能
2017/01/18 Javascript
简单谈谈JS中的正则表达式
2017/09/11 Javascript
不使用JavaScript实现菜单的打开和关闭效果demo
2018/05/01 Javascript
基于vue中对鼠标划过事件的处理方式详解
2018/08/22 Javascript
JavaScript函数、闭包、原型、面向对象学习笔记
2018/09/06 Javascript
解决ng-repeat产生的ng-model中取不到值的问题
2018/10/02 Javascript
vue+element-ui+axios实现图片上传
2019/08/20 Javascript
element表格翻页第2页从1开始编号(后端从0开始分页)
2019/12/10 Javascript
vscode+gulp轻松开发小程序的完整步骤
2020/10/18 Javascript
Vue实现返回顶部按钮实例代码
2020/10/21 Javascript
2款Python内存检测工具介绍和使用方法
2014/06/01 Python
跟老齐学Python之字典,你还记得吗?
2014/09/20 Python
Python中标准模块importlib详解
2017/04/16 Python
AI人工智能 Python实现人机对话
2017/11/13 Python
Python代码实现KNN算法
2017/12/20 Python
python利用socketserver实现并发套接字功能
2018/01/26 Python
HTML5表单验证特性(知识点小结)
2020/03/10 HTML / CSS
moosejaw旗下的户外商品促销网站:Mountain Steals
2017/02/27 全球购物
应届生求职信写作技巧
2013/10/24 职场文书
大学活动总结范文
2014/04/29 职场文书
市场营销毕业求职信
2014/08/07 职场文书
小学向国旗敬礼活动方案
2014/09/27 职场文书
就业协议书范本
2014/10/08 职场文书
党校学习党性分析材料
2014/12/19 职场文书
全家福照片寄语怎么写?
2019/04/02 职场文书
详解Java线程池是如何重复利用空闲线程的
2021/06/26 Java/Android
Nginx 匹配方式
2022/05/15 Servers