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 相关文章推荐
js字符串转换成xml对象并使用技巧解读
Apr 18 Javascript
js加密解密字符串可自定义密码因子
May 13 Javascript
分享使用AngularJS创建应用的5个框架
Dec 05 Javascript
纯JS代码实现一键分享功能
Apr 20 Javascript
微信小程序 监听手势滑动切换页面实例详解
Jun 15 Javascript
JavaScript中附件预览功能实现详解(推荐)
Aug 15 Javascript
Vue内容分发slot(全面解析)
Aug 19 Javascript
分享ES6的7个实用技巧
Jan 18 Javascript
React Native 图片查看组件的方法
Mar 01 Javascript
vue封装一个简单的div框选时间的组件的方法
Jan 06 Javascript
详解webpack引入第三方库的方式以及注意事项
Jan 15 Javascript
微信小程序学习笔记之获取位置信息操作图文详解
Mar 29 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的反射机制
2016/12/15 PHP
PHP实现的支付宝支付功能示例
2019/03/26 PHP
JS去除字符串的空格增强版(可以去除中间的空格)
2009/08/26 Javascript
jquery+json实现的搜索加分页效果
2010/03/31 Javascript
jQuery JSON的解析方式分享
2011/04/05 Javascript
JS模拟面向对象全解(一、类型及传递)
2011/07/13 Javascript
JS 如果改变span标签的是否隐藏属性
2011/10/06 Javascript
javascript中判断一个值是否在数组中并没有直接使用
2012/12/17 Javascript
深入理解jQuery中live与bind方法的区别
2013/12/18 Javascript
js插件方式打开pdf文件(浏览器pdf插件分享)
2013/12/20 Javascript
一个不错的js html页面倒计时可精确到秒
2014/10/22 Javascript
JavaScript中的replace()方法使用详解
2015/06/06 Javascript
jquery实现Li滚动时滚动条自动添加样式的方法
2015/08/10 Javascript
jquery仅用6行代码实现滑动门效果
2015/09/07 Javascript
浅析jQuery Mobile的初始化事件
2015/12/03 Javascript
利用JavaScript阻止表单提交的两种方法
2016/08/11 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
2017/05/03 Javascript
微信小程序中页面FOR循环和嵌套循环
2017/06/21 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
2017/08/10 Javascript
js中document.write和document.writeln的区别
2018/03/11 Javascript
vue兄弟组件传递数据的实例
2018/09/06 Javascript
node中的session的具体使用
2018/09/14 Javascript
微信小程序scroll-view横向滑动嵌套for循环的示例代码
2018/09/20 Javascript
使用 webpack 插件自动生成 vue 路由文件的方法
2019/08/20 Javascript
vue 封装 Adminlte3组件的实现
2020/03/18 Javascript
python的正则表达式re模块的常用方法
2013/03/09 Python
Python如何通过subprocess调用adb命令详解
2017/08/27 Python
Django 接收Post请求数据,并保存到数据库的实现方法
2019/07/12 Python
Python Django 实现简单注册功能过程详解
2019/07/29 Python
使用Python生成200个激活码的实现方法
2019/11/22 Python
python3操作注册表的方法(Url protocol)
2020/02/05 Python
Python Tornado批量上传图片并显示功能
2020/03/26 Python
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
问卷调查计划书
2014/01/10 职场文书
教师开学感言
2014/02/14 职场文书
答谢会策划方案
2014/05/12 职场文书