// 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不考虑手机端的更多相关文章

  1. html5音频audio对象处理以及ios微信端自动播放和息屏后唤醒的判断---可供参考(功能都完整实现了,只是细节还没处理的很好)

    // html模版中的 此处结合了weui样式整合的微信手机端片段代码(不可直接粘贴复制进行使用)里面含有一些php的写法,可直接略过..###重点参考js代码### <div> < ...

  2. vue组件定义方式,vue父子组件间的传值

    vue组件定义方式,vue父子组件间的传值 <!DOCTYPE html> <html lang="zh-cn"> <head> <met ...

  3. python 日志的配置,python对日志封装成类,日志的调用

    # python 日志的配置,python对日志封装成类,日志的调用 import logging # 使用logging模块: class CLog: # --------------------- ...

  4. vue_music:封装scroll.vue组件

    在项目中经常用到滚动,结合Better-scroll封装了sroll.vue组件参考链接:https://ustbhuangyi.github.io...http://www.imooc.com/ar ...

  5. vue 组件通讯方式到底有多少种 ?

    前置 做大小 vue 项目都离不开组件通讯, 自己也收藏了很多关于 vue 组件通讯的文章. 今天自己全部试了试, 并查了文档, 在这里总结一下并全部列出, 都是简单的例子. 如有错误欢迎指正. 温馨 ...

  6. 【C++】将调用第三方库的代码封装成动态库供上层调用

    需求分析 Java应用中需要调用C++的程序,而这个C++的程序中需要引入一个第三方静态库.所以需要将该程序编译成一个动态库文件(.so)供Java调用. 步骤 使用CLion创建一个动态库的项目,会 ...

  7. vue 组件 - 函数统一调用(自定义钩子)

    vue 组件继承方法 var childComponent = Vue.extend( { extends: baseComp, // 继承基础组件方法 template:template, wait ...

  8. Vue以CDN方式调用Swiper轮播异常

    问题概览: 有一个小型单页应用项目,嫌用组件式调用vue-swiper麻烦,因此以CDN的方式调用swiper,结果轮播的图不动了! 爬了半天百度和谷歌都无解决方案,最后曲线救国的方式解决了问题. 解 ...

  9. echart——vue封装成公共组件

    <!-- 自定义Echarts * options: Object,//数据 * theme: String,//主题 * initOptions: Object,//初始化 * group: ...

随机推荐

  1. bzoj 5337 [TJOI2018] str

    bzoj 5337 [TJOI2018] str Link Solution 水题 直接 \(f[i][j]\) 表示以第 \(i\) 位为结束位置,当前已经匹配了前 \(j\) 个氨基酸的方案数 使 ...

  2. Restful 1 -- REST、DRF(View源码解读、APIView源码解读)及框架实现

    一.REST 1.什么是编程? 数据结构和算法的结合 2.什么是REST? - url用来唯一定位资源,http请求方式来区分用户行为 首先回顾我们曾经做过的图书管理系统,我们是这样设计url的,如下 ...

  3. yii2.0下,JqPaginator与Pjax实现无刷新翻页

    控制器部分 <?php namespace backend\controllers; use common\models\Common; use Yii; use yii\base\Contro ...

  4. Selenium 开源书(一): Selenium历史

    Selenium历史 Selenium最初由Jason Huggins于2004年开发,作为ThoughtWorks的内部工具.Huggins后来加入了ThoughtWorks的其他程序员和测试人员, ...

  5. NET Core 开发环境

    NET Core 开发环境 最近,一直在往.Net Core上迁移,随着工作的深入,发现.Net Core比.Net Framework好玩多了.不过目前还在windows下开发,虽然VisualSt ...

  6. 1169 传纸条 2008年NOIP全国联赛提高组 个人博客:attack.cf

    1169 传纸条 2008年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond         题目描述 Description 小渊和小轩 ...

  7. Mind must be master of the body, strong mind can separate the body from its suffering.

    Mind must be master of the body, strong mind can separate the body from its suffering.意志是身体的主人,有顽强的意 ...

  8. 关于如何将html中的表格下载成csv格式的方法

    今天在网上看了很多方法,自己还是慢慢探索写出了最终效果 简单代码如下: <!DOCTYPE html> <html> <head> <meta content ...

  9. virtualapk爬坑心得

    1.宿主和插件的工程build.gradle必须是 com.android.tools.build:gradle:2.1.3 gradle-wrapper 必须是 gradle-2.14.1-all ...

  10. Windows基础环境_安装配置教程(Windows7 64、JDK1.8、Android SDK23.0、TortoiseSVN 1.9.5)

    Windows基础环境_安装配置教程(Windows7 64.JDK1.8.Android SDK23.0.TortoiseSVN 1.9.5) 安装包版本 1)     JDK版本包 地址: htt ...