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>

  

posted @ 2018-07-16 14:33  假如会点代码  阅读(1026)  评论(0编辑  收藏  举报