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

下面为您讲解vue quill editor 如何添加富文本上传音频功能的攻略:

1. 安装依赖

首先需要安装vue-quill-editor和quill-image-extend-module的依赖,使用npm命令如下:

npm install vue-quill-editor quill-image-extend-module

2. 引入依赖

在需要实现富文本编辑器的组件中,import引入vue-quill-editor和quill-image-extend-module,并且将组件注册为本地组件,示例代码如下:

<template>
  <div>
    <!-- 编辑器组件 -->
    <vue-quill-editor ref="myQuillEditor"
                      v-model="editorContent"
                      :options="editorOption"/>
  </div>
</template>

<script>
import VueQuillEditor from 'vue-quill-editor'
import Quill from 'quill'
import 'quill/dist/quill.snow.css'
import ImageExtend from 'quill-image-extend-module'

Quill.register('modules/imageExtend', ImageExtend)

export default {
  name: "Editor",
  components: { VueQuillEditor },
  data () {
    return {
      editorContent: '',
      editorOption: {
        placeholder: '请输入详情',
        theme: 'snow',
        modules: {
          toolbar: [
            ['bold', 'italic', 'underline', 'strike'],
            ['blockquote', 'code-block'],
            [{ 'header': 1 }, { 'header': 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'],
            ['link', 'image', 'video', 'audio']
          ],
          imageExtend: {
            loading: true,
            sizeLimit: 1000000,
            terminateOnImageLoad: true
          },
          audio: {
            buttonTitle: "添加音频"
          }
        }
      }
    };
  }
}
</script>

上面代码中,我们使用了"quill-image-extend-module"来实现上传音频文件的功能。在editor Option的modules中添加audio属性,为上传音频定义一个按钮标题,这个按钮将呈现在富文本编辑器的工具栏中。

3. 自定义规则Formats

在组件内定义一个formats的对象,使音频视频都可以被Quill在内容中识别:

<template>
  <div>
    ...
  </div>
</template>

<script>
import VueQuillEditor from 'vue-quill-editor'
import Quill from 'quill'
import 'quill/dist/quill.snow.css'
import ImageExtend from 'quill-image-extend-module'

Quill.register('modules/imageExtend', ImageExtend)

export default {
  name: "Editor",
  components: { VueQuillEditor },
  data () {
    return {
      ...
      editorOption: {
        ...
          formats: [
            'header', 'font', 'size', 'bold', 'italic', 'underline', 'strike', 'blockquote',
            'list', 'bullet', 'indent', 'link', 'image', 'video', 'audio'
          ],
        ...
      },
      ...
    };
  }
}
</script>

4. 定义audio上传事件

我们使用"quill-image-extend-module"来定义上传音频的事件,通过判断文件类型来判断是音频还是视频文件,最后将文件上传到服务器。

<template>
  <div>
    ...
  </div>
</template>

<script>

...

Quill.register('modules/audioExtend', function(quill, options) {
  var audioButton = document.querySelector('.ql-audio');
  audioButton.addEventListener('click', function() {
    var input = document.createElement('input');
    input.setAttribute('type', 'file');
    input.setAttribute('accept', 'audio/*');
    input.click();

    input.onchange = function() {
      var file = input.files[0];
      var formData = new FormData();
      formData.append('file', file);
      console.log(file);
      var url = '';
      postAudio(formData).then(data=>{
        if(data.code === 0){
          url = data.data.url;
          var range = quill.getSelection();
          quill.insertEmbed(range.index, 'audio', url);
        } else {
          Message({
            message: data.msg,
            type: 'error'
          })
        }
      })
    };
  });
});

function postAudio(data) {
  var promise = new Promise((resolve, reject) => {
    axios.post('/api/uploadAudio', data, {
      headers: { 'Content-Type': 'multipart/form-data' }
    })
      .then(response => {
        resolve(response.data)
      }, err => {
        reject(err)
      })
  })
  return promise
}

export default {
  name: "Editor",
  components: { VueQuillEditor },
  data () {
    return {
      ...
      editorOption: {
        ...
        modules: {
          ...
          audioExtend: {}
        } 
      }
      ...
    };
  }
}

</script>

上面代码中,我们使用了"axios"插件将音频文件上传到服务器,服务器可以返回上传后的url,然后将url插入到富文本编辑器的内容中。

5. 显示audio信息

现在音频文件已经上传到服务器,接下来要在富文本编辑器中显示它。在'snow'主题CSS中我们需要添加一个"ql-audio"类来实现这一点。

.ql-snow .ql-audio {
  background-position: center;
  background-repeat: no-repeat;
  background-size: 24px 24px;
  width: 24px;
  height: 24px;
}

最后,我们需要定义audio标签,来实现播放音频的功能。

<template>
  <div>
    <vue-quill-editor ref="myQuillEditor"
                      v-model="editorContent"
                      :options="editorOption"/>
    <audio ref="audioPlayer"/>
  </div>
</template>

<script>

...

Quill.register('modules/audioExtend', function(quill, options) {
  var Audio;

  Audio = Quill.import('formats/audio');
  Audio.tagName = 'AUDIO';
  Quill.register(Audio, true);

  var audioButton = document.querySelector('.ql-audio');
  audioButton.addEventListener('click', function() {
    var input = document.createElement('input');
    input.setAttribute('type', 'file');
    input.setAttribute('accept', 'audio/*');
    input.click();

    input.onchange = function() {
      var file = input.files[0];
      var formData = new FormData();
      formData.append('file', file);
      console.log(file);
      var url = '';
      postAudio(formData).then(data=>{
        if(data.code === 0){
          url = data.data.url;
          var range = quill.getSelection();
          quill.insertEmbed(range.index, 'audio', url);
        } else {
          Message({
            message: data.msg,
            type: 'error'
          })
        }
      })
    };
  });

  Quill.register('modules/audioHandler', function(quill, options) {
    var container = document.querySelector('.ql-editor');
    container.addEventListener('click', function(e) {
      if (e.target && e.target.classList.contains('ql-audio')) {
        var url = e.target.getAttribute('src');
        var audio = this.$refs.audioPlayer;
        audio.src = url;
        e.target.classList.add('playing');
        audio.addEventListener("ended", function() {
          e.target.classList.remove('playing');
        });
        audio.play();
      }
    }.bind(this));
  });
});

...

export default {
  name: "Editor",
  components: { VueQuillEditor },
  data () {
    return {
      ...
      editorOption: {
        ...
        modules: {
          ...
          audioExtend: {},
          audioHandler: {}
        }
      }
      ...
    };
  }
}

</script>

上面代码中,我们通过输入audio标签语句将服务器上的音频文件连接到富文本编辑器的内容。然后,我们又将控制端口添加到了富文本编辑器上,以激活音频播放器。

这就是给vue quill editor添加上传音频功能的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue quill editor 使用富文本添加上传音频功能 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JS实现加载和读取XML文件的方法详解

    JS实现加载和读取XML文件的方法详解 在Web开发中,我们有时会需要从服务器端获取XML文件,然后在前端进行解析和操作。本文将详细讲解JS实现加载和读取XML文件的方法,以及对XML文件进行解析和操作的技巧。 加载XML文件 加载XML文件主要有两种方式,一种是使用AJAX技术,另一种是使用XMLHttpRequest对象。下面分别进行讲解。 AJAX方式…

    JavaScript 2023年5月27日
    00
  • JS原型链怎么理解

    JS原型链是JS中一个非常重要的概念,理解原型链可以帮助我们更好地理解JS中的对象,继承以及函数等相关知识。下面是JS原型链的详细讲解攻略。 什么是原型链? 在了解什么是原型链之前,我们首先要了解JS中对象的原型。 在JS中,每个对象都有一个原型对象 prototype,其包含了一组属性和方法,并且可以和其他对象形成继承关系。在访问一个对象的属性或方法时,如…

    JavaScript 2023年6月10日
    00
  • JavaScript新增的两个原始数据类型详解(Record和Tuple)

    JavaScript新增的两个原始数据类型详解(Record和Tuple) 概述 在ES2021(ES12)中,JavaScript新增了两个原始数据类型:Record(记录)和Tuple(元组)。原始数据类型是指JavaScript内置数据类型,包括number、string、boolean、null、undefined、symbol和BigInt。 Re…

    JavaScript 2023年5月28日
    00
  • js中的闭包实例展示

    让我来详细讲解一下”js中的闭包实例展示”的攻略。 什么是闭包? 闭包是指有权访问外部函数作用域中变量的函数,即使外部函数已经执行完毕。简单来说,就是内部函数使用了外部函数的变量或者参数,并且这个内部函数可以在外部函数执行结束之后被执行。 闭包的特点 内部函数可以访问外部函数的变量,而外部函数不能访问内部函数的变量。 闭包可以更新其引用的外部变量,并且该更新…

    JavaScript 2023年6月10日
    00
  • 原生js 封装get ,post, delete 请求的实例

    下面是详细讲解“原生js 封装get ,post, delete 请求的实例”的完整攻略: 一、前置知识 在封装get, post, delete请求之前,我们需要对Http请求的基本知识有一定了解,比如HTTP请求方式、请求头、响应头、状态码等等。同时,我们也需要学习一些JavaScript中Promise对象的知识。 二、实现思路 通过封装get、pos…

    JavaScript 2023年6月11日
    00
  • 小程序页面间传参的五种方式实例详解

    下面就为你详细讲解“小程序页面间传参的五种方式实例详解”的完整攻略。 一、背景 小程序开发中,需要在不同页面间传递参数,以便实现不同页面间的数据交互,并在目标页面中通过这些参数做出相应的操作。下面,我们就来看一下小程序页面间传参的五种方式实例详解。 二、方式一:query参数传递 query参数传递是小程序页面间传参数最常用的方式。通过传递query参数,目…

    JavaScript 2023年6月11日
    00
  • js clearInterval()方法的定义和用法

    下面是关于“js clearInterval()方法的定义和用法”的完整攻略: clearInterval()方法的定义和用法 定义 clearInterval()是用于关闭由setInterval()方法设置的定时器的方法,它的语法如下: clearInterval(intervalID) 参数intervalID是通过setInterval()方法返回的…

    JavaScript 2023年6月11日
    00
  • js中关于new Object时传参的一些细节分析

    JS中通过new Object()方式创建对象时,可以传入一个参数来初始化对象属性。本文将介绍new Object()时传入参数的一些细节。 1. new Object()传入一个空对象 当new Object()传入一个空对象时,返回的对象与直接使用对象字面量创建对象的效果一样。 const obj1 = new Object({}); const obj…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部