html5音频audio对象封装成vue组件的方式调用以及setTimeout如何在vue2生效 (vue2正在熟悉中,ajax还是用jQuery来写舒服些,里面含有一些php写法可略过) 此网页应用在PC不考虑手机端
// vue2 组件封装如下:
<template>
<div>
<div><!--vue element 组件的引用 Switch 开关 不懂请自行百度(重点参考js部分 如果不熟悉element switch略过就可以了)-->
语音播报 <el-switch v-model="openVoice" active-value="1" inactive-value="0" @change="change_voice" :disabled="validate"></el-switch>
</div>
<div><audio src="" id="audio"></audio></div>
</div>
</template> <script type="text/javascript"> var request_init; // 接收setTimeout() 返回的 ID 值
var order_id = 0; // 初始化订单id
$.ajaxSettings.async = false; // 禁止异步请求,
// 取最新的订单id
$.get('/order/voice', function ($data) {
order_id = $data.order_id;
}) export default {
props: { //模板传递属性
voiceStatus: {
type: String,
required: true
},
},
data(){
return {
openVoice:this.voiceStatus,
validate:false
} },
// 加载完成后执行
mounted:function(){
if(this.openVoice==1){
this.voice_play();
}
},
methods: {
// 封装播放语音的方法
voice_play(){
var audio=document.getElementById('audio'); // 音频播放对象标签
var $this=this;
$.ajax({
url: '/order/voice',
type: 'get',
data: {order_id: order_id},
dataType: "json",
success: function($data){
if ($data != '' && $data != undefined) { // 如果有语音的情况处理
$this.validate=false; // 来网络时开启按钮
order_id = $data.order_id;
audio.src = $data.voice;
audio.play();
audio.onended = function () {
if($this.openVoice==1) {
clearTimeout(request_init);
request_init=setTimeout(function(){$this.voice_play()},2000); // 以匿名函数形式设置settimeout即可实现两秒请求一次
}
}
} else {
$this.validate=false; // 来网络时开启按钮
clearTimeout(request_init);
request_init=setTimeout(function(){$this.voice_play()},2000);
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
$this.validate=true; // 断网就禁用此按钮 继续往下执行请求
request_init=setTimeout(function(){$this.voice_play()},2000);
//console.log(XMLHttpRequest);
}
})
},
change_voice(event){
var audio=document.getElementById('audio'); // 音频播放对象标签
var $this=this;
if (event==1) { // 判断是否选中(表示开启语音)
$this.openVoice='0'; // 在回调未成功之前不能改变按钮的状态
// 再次取最新的订单号
$.get('/order/voice', function ($data) {order_id = $data.order_id;})
$this.$http.get('/system/voice/index', {params: {status: 1}})
.then(res => {
if(res.data==1){ // res.data由后台返回 1表示成功 0表示失败,目前只考虑成功
$this.openVoice='1'; // 在回调成功之后改变按钮的状态
$this.voice_play();
}
})
.catch(_=>{})
} else { // 关闭
$this.openVoice='1'; // 在回调未成功之前不能改变按钮的状态
audio.pause(); // 停止播放
$this.$http.get('/system/voice/index', {params: {status: 2}})
.then(res => {
if(res.data==1){
$this.openVoice='0'; // 在回调成功之后改变按钮的状态
clearTimeout(request_init); // 终止setTimeout 定时回调
}
})
.catch(_=>{
$this.validate=true; // 断网就禁用此按钮
request_init=setTimeout(function(){$this.voice_play()},2000);
})
}
}
},
};
</script>
// ----------------------------------------------以上为vue2的组件-----------------------------------------------仅供参考
// 在html模版中使用如下:
<div >
<!--$voice 是后台php传参过来的 只会为0和1-->
<voice voice-status="{{ $voice }}"></voice>
</div>
html5音频audio对象封装成vue组件的方式调用以及setTimeout如何在vue2生效 (vue2正在熟悉中,ajax还是用jQuery来写舒服些,里面含有一些php写法可略过) 此网页应用在PC不考虑手机端的更多相关文章
- html5音频audio对象处理以及ios微信端自动播放和息屏后唤醒的判断---可供参考(功能都完整实现了,只是细节还没处理的很好)
// html模版中的 此处结合了weui样式整合的微信手机端片段代码(不可直接粘贴复制进行使用)里面含有一些php的写法,可直接略过..###重点参考js代码### <div> < ...
- vue组件定义方式,vue父子组件间的传值
vue组件定义方式,vue父子组件间的传值 <!DOCTYPE html> <html lang="zh-cn"> <head> <met ...
- python 日志的配置,python对日志封装成类,日志的调用
# python 日志的配置,python对日志封装成类,日志的调用 import logging # 使用logging模块: class CLog: # --------------------- ...
- vue_music:封装scroll.vue组件
在项目中经常用到滚动,结合Better-scroll封装了sroll.vue组件参考链接:https://ustbhuangyi.github.io...http://www.imooc.com/ar ...
- vue 组件通讯方式到底有多少种 ?
前置 做大小 vue 项目都离不开组件通讯, 自己也收藏了很多关于 vue 组件通讯的文章. 今天自己全部试了试, 并查了文档, 在这里总结一下并全部列出, 都是简单的例子. 如有错误欢迎指正. 温馨 ...
- 【C++】将调用第三方库的代码封装成动态库供上层调用
需求分析 Java应用中需要调用C++的程序,而这个C++的程序中需要引入一个第三方静态库.所以需要将该程序编译成一个动态库文件(.so)供Java调用. 步骤 使用CLion创建一个动态库的项目,会 ...
- vue 组件 - 函数统一调用(自定义钩子)
vue 组件继承方法 var childComponent = Vue.extend( { extends: baseComp, // 继承基础组件方法 template:template, wait ...
- Vue以CDN方式调用Swiper轮播异常
问题概览: 有一个小型单页应用项目,嫌用组件式调用vue-swiper麻烦,因此以CDN的方式调用swiper,结果轮播的图不动了! 爬了半天百度和谷歌都无解决方案,最后曲线救国的方式解决了问题. 解 ...
- echart——vue封装成公共组件
<!-- 自定义Echarts * options: Object,//数据 * theme: String,//主题 * initOptions: Object,//初始化 * group: ...
随机推荐
- SQL 主键
主键: 1.任意两行都不具有的相同的主键值 2.没一列都必须有一个主键值(主键列不允许NULL值) 3.主键列中的值不允许修改或更新 4.主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行 ...
- POJ-3177-RedundantPaths(边联通分量,缩点)
链接:https://vjudge.net/problem/POJ-3177#author=Dillydally 题意: 有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可 ...
- proxy_pass http://127.0.0.1:5000; 502 bad getway
(13: Permission denied) while connecting to upstream:[nginx] I am working with configuring django pr ...
- eclipse导入基于maven的java项目后没有Java标志和没有maven Dependencies有解决办法
没有java标志,不识别为Java项目,右键项目-->Properties-->Project Facets-->勾选Java 确定就可以了. 没有maven Dependenc ...
- (转)nginx域名访问的白名单配置梳理
nginx域名访问的白名单配置梳理 原文:http://www.cnblogs.com/kevingrace/p/6086652.html 在日常运维工作中,会碰到这样的需求:设置网站访问只对某些ip ...
- 《springcloud 五》springcloud stream
什么是消息驱动? SpringCloud Stream消息驱动可以简化开发人员对消息中间件的使用复杂度,让系统开发人员更多尽力专注与核心业务逻辑的开发.SpringCloud Stream基于Spri ...
- escape,encodeURI,encodeURIComponent 之间的区别和使用
escape(目前已经被淘汰)是对字符串(string)进行编码(而另外两种是对URL),不会对下列字符编码 ASCII字母 数字 @*/+ 最关键的是,当你需要对URL编码时,请忘记这个方法,这 ...
- [Oracle 视图] ALL_OBJECTS
ALL_OBJECTS ALL_OBJECTS describes all objects accessible to the current user. ALL_OBJECTS描述当前用户的可访问的 ...
- 常用浏览器User-Agent大全
=======================PC浏览器======================== OperaMozilla/5.0 (Windows NT 6.1; WOW64) AppleW ...
- Yii2 的快速配置 api 服务 yii2-fast-api
yii2-fast-api yii2-fast-api是一个Yii2框架的扩展,用于配置完善Yii2,以实现api的快速开发. 此扩展默认的场景是APP的后端接口开发,因此偏向于实用主义,并未完全采用 ...