如何从另一个函数中清除js计时器

时间:2018-02-06 12:09:06

标签: javascript jquery timer

我需要帮助,我只想停止js中setInterval()启动的计时器 但在另一个我必须停止这个计时器 请告诉我是否可以使用jquery或js

杀死页面中的所有计时器

这是我启动计时器的功能: -

function get_question(cat_id){
    //count = parseInt(count) + 1;

    $('#action-options').show();
    var user_id = '<?php echo $user->ID; ?>';
    if(cat_id=='')
    {
        var cat_id = $('#cat_id').val();;
    }
    var roomid = $('#roomid').val();
    /*var round = $('.round').find(h4).html();
    console.log('round : ',round);*/
    var current_round = counter;
    //console.log(current_round);
    $.ajax({
        url : '<?php echo admin_url("admin-ajax.php"); ?>',
        type : 'post',
        data : { action : 'get_question', cat_id : cat_id, roomid : roomid,current_round : current_round , user_id : user_id},
        success : function(res){
        //  console.log('current question :',res);
            $('.round').html("<h4>Round "+counter+"</h4>"); 
            res = JSON.parse(res);
            $('.questions').html('');
        //  console.log('length',res.length);
            for(x=0;x<res.length;x++)  
            {
            //  console.log(res[x]);
                //var parsedjson = JSON.parse(res[x]);
                var parsedjson = res[x];
            //  console.log('data :',parsedjson);
                if(parsedjson['options'])
                { 
                var arr = parsedjson.options.split(","); 

                $('.questions').append('<div class="question_text'+x+'" data-id="'+parsedjson.id+'"><h3>'+parsedjson.questions+'</h3></div><div class="options'+x+'" id="pik"><input type="radio" name="options'+x+'" value="'+arr[0]+'"><label>'+arr[0]+'</label><input type="radio" name="options'+x+'" value="'+arr[1]+'"><label>'+arr[1]+'</label><input type="radio" name="options'+x+'" value="'+arr[2]+'"><label>'+arr[2]+'</label><input type="radio" name="options'+x+'" value="'+arr[3]+'"><label>'+arr[3]+'</label> </div> ');
                }
                else{
                    $('.questions').append('<div class="question_text'+x+'" data-id="'+parsedjson.id+'"><h3>'+parsedjson.questions+'</h3></div><div class="options'+x+'" id="kip"><input type="text" name="answer'+x+'" > </div> ');
                }
            }
            var time_limit =0;
            //var   counter = 1;
                $.ajax({
                url : '<?php echo admin_url("admin-ajax.php");?>',
                type : 'post',
                data : {action : 'get_round_time',counter : counter, cat_id : cat_id},
                success : function(response){
                //  console.log('response',response);
                var round_no = counter;
                    time_limit= response;
                //  console.log(time_limit);
                         start_timer = window.setInterval(function(){
                        var timer = time_limit-1; 
                            time_limit=timer;
                            //limit = timer;
                            if(timer==0)
                            { 
                                $('#action-options').css('pointer-events','');
                                $('#action-options').css('cursor','');
                                $('.questions').html('');
                                $('.round').html('<h4>Round '+counter+'</h4>');
                                check_current_round_answers(round_no);
                                if(counter==3)
                                {

                                    if(timer==0) 
                                    {

                                            $('.timer').html('Please wait for your results !'); 
                                            $('.questions').html(''); 
                                            clearInterval(start_timer);
                                            get_final_results();
                                            return false;
                                    }

                                }
                                //console.log('current_round : ',current_round);
                                counter = counter+1;
                                $('.timer').html('');
                                clearInterval(start_timer);
                                get_question(cat_id);

                            }
                          $('.timer').html('<h4>'+timer+'</h4>');

                        }, 1000);
                }

            });






        }
    });
}

这是我想要停止计时器的第二个功能

function check_current_round_answers(round){
    console.log('current round : ',round);
    var roomid = $('#roomid').val();
    var user_id = '<?php echo $user->ID; ?>';
    $.ajax({
        url : '<?php echo admin_url('admin-ajax.php'); ?>',
        type : 'post',
        data : { action: 'get_round_result',round:round, roomid:roomid, user_id : user_id},
        success : function(val){
            console.log(val);
            if(val.indexOf('turn skipped')!=-1)
            {
                console.log('start_timer ',start_timer);
                clearInterval(start_timer);
                var name = '<?php echo $user->display_name; ?>';
                get_final_results();
                var d = new Date();
                var params = {
                    'message': name+' has skipped',
                    'action': 'message',
                    'timestamp': d.getTime()/1000
                };
                conn.send(JSON.stringify(params)); 
            }
        }
    });

} 

2 个答案:

答案 0 :(得分:0)

我花了10秒钟查看你的代码(它的代码太多了),但你需要的所有代码都是:

var intervalID;

function ticker(){
    console.log("tick");
}

function startTicking(){
    intervalID = setInterval(ticker, 1000);
}

function stopTicking(){
    clearInterval(intervalID);
}

这是一个方法startTicking开始一个间隔,另一个方法stopTicking停止(清除)间隔。 intervalID是两个函数都可以访问的声明变量。

从您发布的代码中,start_timer尚未声明,因此将成为全局变量:window.start_timer

另一方面,如果您错误地声明了start_timer,则在您尝试使用它时可能无法访问它。例如,不起作用(永远滴答):

function ticker(){
    console.log("tick");
}

function initTicker() {
    var intervalID;

    function startTicking(){
        intervalID = setInterval(ticker, 1000);
    }

    startTicking();
}

function stopTicking(){
    clearInterval(intervalID); // Uncaught ReferenceError: intervalID is not defined
}

答案 1 :(得分:0)

问题是你在两个函数中都使用start_timer。根据代码我不认为它在任何地方被宣布。

使用全局变量并在两个函数之外声明它。

var set_timer;

或者你也可以在全局使用的情况下使用window对象(不推荐..但如果你使用它,请确保你不会覆盖现有的窗口属性)

start_timer替换为window.start_timer

如果您有多个setInterval ,则创建一个全局数组变量并将每个setInterval存储到其中。只需循环此数组并清除间隔。