zoukankan      html  css  js  c++  java
  • 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>
    

      

  • 相关阅读:
    Rex 密钥认证
    MQTT协议之moquette 安装使用
    开源MQTT中间件:moquette
    Hazelcast入门简介
    Maven和Gradle对比
    rex 上传文件并远程执行
    myeclipse配置gradle插件
    ansible 新手上路
    CentOS release 6.5 (Final) 安装ansible
    spring boot 使用profile来分区配置
  • 原文地址:https://www.cnblogs.com/jiang-xy/p/9317519.html
Copyright © 2011-2022 走看看