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

yizhihongxing

下面为您讲解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日

相关文章

  • 一篇文章搞懂JavaScript正则表达式之方法

    下面是“一篇文章搞懂JavaScript正则表达式之方法”的完整攻略: 什么是正则表达式 正则表达式(Regular Expression,regex,RegExp)是一种用来进行字符串匹配的工具。它通过一些特定字符的组合和描述规则来匹配文本中的字符序列。JavaScript 中使用正则表达式同样非常方便。 创建正则表达式 在 JavaScript 中,有两…

    JavaScript 2023年6月10日
    00
  • 一文详解JavaScript中this指向的问题

    一文详解JavaScript中this指向的问题 JavaScript中的this是一个经常让人困惑的概念。它在不同的上下文中指向不同的值,这使得它的行为非常难以预测。本文将详细讲解JavaScript中this的几种不同情况及其原因。 什么是this? 首先,让我们明确一下this的定义。在JavaScript中,this的值取决于代码执行时的上下文。换句…

    JavaScript 2023年6月10日
    00
  • js给对象动态添加、设置、删除属性名与属性值实例代码

    让我们来详细讲解“js给对象动态添加、设置、删除属性名与属性值实例代码”的完整攻略。 添加属性名与属性值 我们可以使用点号(.)或者方括号[]的方式来向对象动态添加属性名和属性值。 点号添加 点号添加属性名和属性值的方式简单易懂,只需要在对象名后面接一个点号,再加上新的属性名,然后设置属性值即可。如下面这个例子: let obj = { name: &quo…

    JavaScript 2023年5月27日
    00
  • 通过扫小程序码实现网站登陆功能

    通过扫小程序码实现网站登录功能是一种方便、快捷且安全的方式。以下是完整攻略: 步骤一:生成小程序码 首先,我们需要创建一个用于扫描的小程序码。 在微信公众平台上注册并登录小程序开发者账号,创建一个小程序。 进入“开发” -> “开发设置”,启用“小程序登录”。 在后台服务器上生成一个随机字符串,作为本次登录的唯一标识(也可以使用其他方式生成)。 使用该…

    JavaScript 2023年5月19日
    00
  • JavaScript中获取HTML元素值的三种方法

    当我们在编写 JavaScript 代码时,常常需要获取 HTML 元素的值。下面介绍三种常见的方法来获取 HTML 元素的值。 1. 使用 document.getElementById() 方法 document.getElementById() 方法是用来获取指定 id 的元素的,然后我们可以使用 value 属性获取元素的值。示例代码如下: // H…

    JavaScript 2023年6月10日
    00
  • input禁止键盘及中文输入,但可以点击

    要实现input禁止键盘及中文输入,但可以点击的效果,需要使用HTML标签和JavaScript语言。下面是具体的实现步骤: HTML标签部分 在HTML标签中,需要给input标签添加readonly和onfocus两个属性。readonly属性可以让input禁止键盘输入,onfocus属性可以在输入框被点击时触发相应的JavaScript函数。具体代码…

    JavaScript 2023年6月11日
    00
  • js eval函数使用,js对象和字符串互转实例

    JS Eval函数使用攻略: eval() 函数可以计算某个 JavaScript 字符串,并执行其中的 JavaScript 代码。使用该函数可以动态创建 JavaScript 代码并在页面中执行,其语法如下: eval(string) 其中,string 参数为要执行的 JavaScript 代码。实现时需要注意,eval() 函数会将字符串参数解析为 …

    JavaScript 2023年5月28日
    00
  • Javascript Worker子线程代码实例

    Javascript Worker子线程代码实例完整攻略 在前端开发中,为了避免一些复杂的计算或者耗时操作影响到UI的性能,我们可以使用Web Worker来创建一个新的线程来执行这些计算。 Worker的特点 Web Worker是一种实现了多线程的JavaScript。它可以使得浏览器在后台运行独立的脚本线程,将一些需要较长时间才能运行完成的任务交给这些…

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