vue quill editor 使用富文本添加上传音频功能
1.前言
vue-quill-editor是vue项目中常用的富文本插件,其功能能满足大部分的项目需求。但是,最近项目中,需要在富文本中上传音频文件,但是vue-quill-editor这个富文本仅支持图片,视频上传;所以这个功能需要自定义。
怎么实现这个功能?
- 写一个只能上传音频的组件,并且隐藏
- 在富文本插件的toolbar定义一个按钮,点击时调用上传组件
- 监听上传成功的回调函数,在富文本输入框中插入音频标签
2.功能实现
2.1基于Element-ui实现上传组件,并且隐藏(不能让用户点击)
upload
对应的钩子函数:
actionUrl:直接根据后台接口赋值即可
beforeUpload:验证是否为音频
beforeUpload(file){
//file.type好像只能返回图片的格式,其他的将会是"",所以需要自己获取后缀名判断文件格式
letpointIndex=file.name.lastIndexOf(".");
letfileType=file.name.substring(pointIndex+1);//获取到文件后缀名
//if(fileType!=='mp3'&&fileType!=='ogg'&&fileType!=='wav'){
if(fileType!=='mp3'&&fileType!=='ogg'){
this.$message.error('你选择的文件不是音频哦,仅支持mp3和ogg格式')
returnfalse
}
},
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"按钮样式
constvoiceButton=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:1pxsolid#ccc;border-radius:5px;";
//voiceButton.innerText="上传音频";
}
},
B.mounted中初始化显示按钮
mounted(){
this.editorOption.initVoiceButton();//初始化音频图标,这样才能显示
},
添加完成后效果:
如果是在不同的文件,即配置文件和组件调用不在同一个文件,请参考:在quill-editor组件工具栏中添加自定义的方法,这篇文章在自定义按钮部分写的很清楚!
3.监听上传成功的回调函数,在富文本输入框中插入音频标签
这一步骤是整个功能的核心!!!
网上有很多显示自定义功能显示的文字,但主要都是以图片为主。大多用的都是quill的pasteHTML方法,但我试了以后并不能实现。将
解决方法:自定义FileBlot==>>Quill调用自定义Blot(即自定义一个Quill能解析显示的标签,并且添加的里面去)
quill-editor组件调用
import{quillEditor,Quill}from'vue-quill-editor'
components:{
quillEditor
},
handleSuccess:上传成功的回调,主要功能实现的地方
handleSuccess(res,file,fileList){
this.fullscreenLoading=false;
//获取富文本组件实例
letquill=this.$refs.myTextEditor.quill
if(res.code===0){//如果上传成功
letlength=quill.getSelection().index;//获取光标所在位置
letBlockEmbed=Quill.import('blots/block/embed');
classAudioBlotextendsBlockEmbed{
staticcreate(value){
letnode=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
returnnode;
}
//staticvalue(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富文本添加上传音频功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。