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 相关文章推荐
Prototype 学习 Prototype对象
Jul 12 Javascript
ie支持function.bind()方法实现代码
Dec 27 Javascript
js创建子窗口并且回传值示例代码
Jul 02 Javascript
js图片延迟加载的实现方法及思路
Jul 22 Javascript
JavaScript AOP编程实例
Jun 16 Javascript
深入浅析JavaScript系列(13):This? Yes,this!
Jan 05 Javascript
javascript实现在网页中运行本地程序的方法
Feb 03 Javascript
搞定immutable.js详细说明
May 02 Javascript
Angular5中状态管理的实现
Sep 03 Javascript
bootstrap与pagehelper实现分页效果
Dec 29 Javascript
Node 模块原理与用法详解
May 13 Javascript
js实现滑动进度条效果
Aug 21 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+mysqli实现将数据库中一张表信息打印到表格里的方法
2015/01/28 PHP
php使用timthumb生成缩略图的方法
2016/01/22 PHP
PHP通过引用传递参数用法分析
2016/12/01 PHP
PHP中quotemeta()函数的用法讲解
2019/04/04 PHP
jquery 必填项判断表单是否为空的方法
2008/09/14 Javascript
javascript 添加和移除函数的通用方法
2009/10/20 Javascript
利用进制转换压缩数字函数分享
2014/01/02 Javascript
jquery.Ajax()方法调用Asp.Net后台的方法解析
2014/02/13 Javascript
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
jquery在ie7下选择器的问题导致append失效的解决方法
2016/01/10 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
微信小程序 后台登录(非微信账号)实例详解
2017/03/31 Javascript
JS实现在文本指定位置插入内容的简单示例
2017/12/22 Javascript
vue数据控制视图源码解析
2018/03/28 Javascript
vue里如何主动销毁keep-alive缓存的组件
2019/03/21 Javascript
jquery 回调操作实例分析【回调成功与回调失败的情况】
2019/09/27 jQuery
解决vue路由name同名,路由重复的问题
2020/08/05 Javascript
js实现列表按字母排序
2020/08/11 Javascript
[00:47]DOTA2荣耀之路6:玩不了啦!
2018/05/30 DOTA
Bottle框架中的装饰器类和描述符应用详解
2017/10/28 Python
Python实现中一次读取多个值的方法
2018/04/22 Python
详解用TensorFlow实现逻辑回归算法
2018/05/02 Python
Python多线程处理实例详解【单进程/多进程】
2019/01/30 Python
Python3如何判断三角形的类型
2020/04/12 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
2020/05/15 Python
你不知道的葡萄干处理法、橙蜜处理法、二氧化碳酵母法
2021/03/17 冲泡冲煮
不同浏览器对CSS3和HTML5的支持状况
2009/10/31 HTML / CSS
详解css3中dispaly的Grid布局与Flex布局
2020/09/11 HTML / CSS
Vince官网:全球著名设计师品牌,休闲而优雅的服饰
2017/01/15 全球购物
Madda Fella官网:美国冒险家服装品牌
2020/01/16 全球购物
幼师求职自荐信范文
2014/01/26 职场文书
人事文员岗位职责
2015/02/04 职场文书
幼儿园教师求职信
2015/03/20 职场文书
2015年组织部工作总结
2015/04/03 职场文书
导游带团欢迎词
2015/09/30 职场文书
大学军训口号大全
2015/12/24 职场文书