vue quill editor 使用富文本添加上传音频功能


Posted in Javascript onJanuary 14, 2020

1. 前言

vue-quill-editor 是vue项目中常用的富文本插件,其功能能满足大部分的项目需求。但是,最近项目中,需要在富文本中上传音频文件,但是vue-quill-editor这个富文本仅支持图片,视频上传;所以这个功能需要自定义。

怎么实现这个功能?

  • 写一个只能上传音频的组件,并且隐藏
  • 在富文本插件的toolbar定义一个按钮,点击时调用上传组件
  • 监听上传成功的回调函数,在富文本输入框中插入音频标签

2. 功能实现

2.1 基于Element-ui实现上传组件,并且隐藏(不能让用户点击)

<!-- 
首先,必须隐藏这个元素:display:none;
v-loading.fullscreen.lock:设置上传时显示loading,值为true/false;
action:设置上传的地址;
before-upload:上传前的钩子函数,验证是否为音频文件;
on-success:上传成功的钩子函数;
on-progress:上传时的钩子函数,设置显示loading
 -->
<div style="display:none">
  <el-upload
    v-loading.fullscreen.lock="fullscreenLoading"
    :action="actionUrl"
    :before-upload="beforeUpload"
    :on-success="handleSuccess"
    :on-progress="uploadIng"
  >
  <el-button size="small" class="uploadVoiceBtn" type="primary">upload</el-button>
  </el-upload>
</div>

对应的钩子函数:

actionUrl:直接根据后台接口赋值即可
beforeUpload:验证是否为音频

beforeUpload(file){
  // file.type好像只能返回图片的格式,其他的将会是 "", 所以需要自己获取后缀名判断文件格式
  let pointIndex = file.name.lastIndexOf(".");
  let fileType = file.name.substring(pointIndex+1);  //获取到文件后缀名
  // if (fileType !== 'mp3' && fileType !== 'ogg' && fileType !== 'wav') {
  if (fileType !== 'mp3' && fileType !== 'ogg') {
    this.$message.error('你选择的文件不是音频哦,仅支持mp3和ogg格式')
    return false
  }
},

handleSuccess:上传成功的回调,主要功能实现的地方,后面介绍

uploadIng:设置显示loading

uploadIng(){    //上传时显示loading
  this.fullscreenLoading = true
}

2.2 在富文本插件的toolbar定义一个按钮,点击时调用上传组件

注意:vue-quill-editor是基于quill富文本的二次封装(源码可以很容易看出来),所以需要看配置方法的直接去看quill即可

A. 修改 editorOption 配置,添加一个按钮:

//富文本设置
editorOption: {
  modules: {
    ...,      //其他配置,如quill-image-extend-module
    toolbar: {
      container: [
        ['bold', 'italic', 'underline', 'strike'],
        [{ 'size': ['small', false, 'large', 'huge'] }],
        [{ 'header': [1, 2, 3, 4, 5, 6, false] }],
        [{ 'color': [] }, { 'background': [] }],
        ['blockquote', 'code-block'],
        ['link', 'image'],
        ['voice']   //新添加的工具
      ],
      handlers: {
        'voice': function(value){   //添加工具方法,即点击时模仿点击上传组件的按钮
         document.querySelector('.uploadVoiceBtn').click()
        }
      }
    }
  },
  initVoiceButton:function(){   //初始化"voice"按钮样式
    const voiceButton = document.querySelector('.ql-voice'); //"ql-" 是插件自动加的前缀
    
    // 添加样式,使用fontawesome初始化图标的样式
    voiceButton.classList.add('fa');
    voiceButton.classList.add('fa-volume-up');
    voiceButton.classList.add('fa-lg');

    // 当然,可以直接手写样式,如:
    // voiceButton.style.cssText = "width:80px; border:1px solid #ccc; border-radius:5px;";
    // voiceButton.innerText="上传音频";
  }
},

B. mounted中初始化显示按钮

mounted(){
  this.editorOption.initVoiceButton();   //初始化音频图标,这样才能显示
},

添加完成后效果:

vue quill editor 使用富文本添加上传音频功能

如果是在不同的文件,即配置文件和组件调用不在同一个文件,请参考:在quill-editor组件工具栏中添加自定义的方法,这篇文章在自定义按钮部分写的很清楚!

3. 监听上传成功的回调函数,在富文本输入框中插入音频标签

这一步骤是整个功能的核心!!!

网上有很多显示自定义功能显示的文字,但主要都是以图片为主。大多用的都是 quill 的 pasteHTML 方法,但我试了以后并不能实现。将<audio src="" controls="true" ></audio>这样的字符串加入到富文本绑定的变量上面后,并不能显示。最后,可以使用insertEmbed插入对象到富文本中,但是,这个方法好像也只能插入image,不能插入其他的标签。

解决方法:自定义FileBlot ==>> Quill调用自定义Blot (即自定义一个Quill能解析显示的标签,并且添加的里面去)

quill-editor 组件调用

import { quillEditor, Quill } from 'vue-quill-editor'
components: {
  quillEditor
},
<!-- change是内容改变后的回调函数,做页面处理,这里不说,自行根据系统页面处理 -->
<quill-editor ref="myTextEditor" v-model="editorTempValue" :options="editorOption" @change="onEditorChange($event)"> </quill-editor>

handleSuccess:上传成功的回调,主要功能实现的地方

handleSuccess(res, file, fileList){
  this.fullscreenLoading = false;
  // 获取富文本组件实例
  let quill = this.$refs.myTextEditor.quill
  if (res.code === 0) {   // 如果上传成功
    let length = quill.getSelection().index; // 获取光标所在位置

    let BlockEmbed = Quill.import('blots/block/embed');
    class AudioBlot extends BlockEmbed {
      static create(value) {
        let node = super.create();
        node.setAttribute('src', value.url);   //设置audio的src属性
        node.setAttribute('controls', true);   //设置audio的controls,否则他将不会显示
        node.setAttribute('controlsList', 'nodownload');   //设置audio的下载功能为不能下载
        node.setAttribute('id', 'voice');     //设置一个id
        return node;
      }

      // static value(node) {
      //  return {
      //   url: node.getAttribute('src')
      //  };
      // }
    }
    AudioBlot.blotName = 'audio';
    AudioBlot.tagName = 'audio';   //自定义的标签为audio
    Quill.register(AudioBlot);

    // insertEmbed(index: Number(插入的位置), type: String(标签类型), value: any(参数,将传入到create的方法中去), source: String = 'api')
    quill.insertEmbed(length, 'audio', {url: res.data.url}, "api");
    quill.setSelection(length + 1); //光标位置向后移动一位
  } else {    
    this.$message.error(res.msg);    // 上传失败,提示错误信息
  }
},

完成后效果:

vue quill editor 使用富文本添加上传音频功能

总结

以上所述是小编给大家介绍的vue-quill-editor 富文本添加上传音频功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
Extjs学习笔记之七 布局
Jan 08 Javascript
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
Sep 09 Javascript
利用谷歌地图API获取点与点的距离的js代码
Oct 11 Javascript
Jquery 在页面加载后执行的几种方式
Mar 14 Javascript
javascript实现浏览器窗口传递参数的方法
Sep 03 Javascript
Javascript中this的用法详解
Sep 22 Javascript
JS实现的通用表单验证插件完整实例
Aug 20 Javascript
ES2015 Symbol 一种绝不重复的值
Dec 25 Javascript
原生js实现电商侧边导航效果
Jan 19 Javascript
AngularJS实现路由实例
Feb 12 Javascript
jQuery实现的form转json经典示例
Oct 10 jQuery
javaScript中indexOf用法技巧
Nov 26 Javascript
JavaScript事件冒泡机制原理实例解析
Jan 14 #Javascript
JS window对象简单操作完整示例
Jan 14 #Javascript
让mocha支持ES6模块的方法实现
Jan 14 #Javascript
JavaScript遍历数组的方法代码实例
Jan 14 #Javascript
JavaScript回调函数callback用法解析
Jan 14 #Javascript
JS document对象简单用法完整示例
Jan 14 #Javascript
JS document内容及样式操作完整示例
Jan 14 #Javascript
You might like
PHP has encountered an Access Violation at 7C94BD02解决方法
2009/08/24 PHP
PHP开发工具ZendStudio下Xdebug工具使用说明详解
2013/11/11 PHP
PHP中的事务使用实例
2015/05/26 PHP
php实现统计目录文件大小的函数
2015/12/25 PHP
静态html文件执行php语句的方法(推荐)
2016/11/21 PHP
PHP搭建大文件切割分块上传功能示例
2017/01/04 PHP
基于jQuery UI CSS Framework开发Widget的经验
2010/08/21 Javascript
用Javascript实现Windows任务管理器的代码
2012/03/27 Javascript
JS小功能(button选择颜色)简单实例
2013/11/29 Javascript
js获取url中&quot;?&quot;后面的字串方法
2014/05/15 Javascript
判断在css加载完毕后执行后续代码示例
2014/09/03 Javascript
javascript实现youku的视频代码自适应宽度
2015/05/25 Javascript
jQuery右下角旋转环状菜单特效代码
2015/08/10 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
js判断传入时间和当前时间大小实例(超简单)
2018/01/11 Javascript
Vue中父子组件通讯之todolist组件功能开发
2018/05/21 Javascript
微信小程序 scroll-view的使用案例代码详解
2020/06/11 Javascript
让Vue响应Map或Set的变化操作
2020/11/11 Javascript
Python下Fabric的简单部署方法
2015/07/14 Python
Python MD5加密实例详解
2017/08/02 Python
python使用递归的方式建立二叉树
2019/07/03 Python
Python学习笔记之Zip和Enumerate用法实例分析
2019/08/14 Python
python标准库OS模块详解
2020/03/10 Python
Python Celery异步任务队列使用方法解析
2020/08/10 Python
python中random.randint和random.randrange的区别详解
2020/09/20 Python
Django contrib auth authenticate函数源码解析
2020/11/12 Python
英国第二大营养品供应商:Vitabiotics
2016/10/01 全球购物
美国在线工具商店:Acme Tools
2018/06/26 全球购物
历史学专业毕业生求职信
2013/09/27 职场文书
大学生实习证明范本
2014/01/15 职场文书
个人公开承诺书
2014/03/28 职场文书
教师产假请假条范文
2014/04/10 职场文书
公共场所禁烟倡议书
2014/08/30 职场文书
水利局群众路线专题民主生活会发言材料
2014/09/21 职场文书
2014党委书记四风对照检查材料思想汇报
2014/09/21 职场文书
幼儿园新生开学寄语
2015/05/27 职场文书