每个周期后,setInterval时间变得更快

时间:2015-08-07 09:19:01

标签: javascript jquery google-analytics

您好我正在尝试跟踪用户在网页上花费的时间。所以我写了以下javascript来做到这一点。

脚本开始跟踪窗口聚焦的时间,然后在用户移动到其他选项卡或最小化窗口时暂停。

here is the fiddle:

以下是代码:

$(function(){
    var count = 0;
    var interval;

    var ispaused=false;
    function setPause(){
        ispaused=true;
    }

    function unpause(){
        ispaused=false;
    }

    $(window).on("blur focus", function(e) {
        var prevType = $(this).data("prevType");

        if (prevType != e.type) {   //  reduce double fire issues
            switch (e.type) {
                case "blur":
                    setPause();
                    clearInterval(interval);
                    break;
                case "focus":
                    unpause();
                    var interval = setInterval(
                        function(){
                            if(!ispaused) {
                                $('#timer').text(count += 1);
                            }
                        },1000
                    );
                    break;
            }
        }

        $(this).data("prevType", e.type);
});

});

定时器在您对焦区域时启动,在模糊时暂停,但定时器在每次对焦和模糊循环后变得更快。不知道为什么会这样。请帮忙!

1 个答案:

答案 0 :(得分:0)

我检查了你提供的小提琴,发现你将区间变量存储在一个局部变量上,我试图修复问题,看看它是否正常工作,并在这里更新了小提琴:

http://jsfiddle.net/9fzd1dap/1/

这是更新的脚本

    $(function () {
        var count = 0;
        var interval; //This is the global interval variable

        var ispaused = false;
        function setPause() {
            ispaused = true;
        }

        function unpause() {
            ispaused = false;
        }

        $(window).on("blur focus", function (e) {
            var prevType = $(this).data("prevType");

            if (prevType != e.type) {   //  reduce double fire issues
                switch (e.type) {
                    case "blur":
                        setPause();
                        break;
                    case "focus":
                        unpause();
                        clearInterval(interval);
                        //I removed the var keyword from the line below to prevent dual declarations.
                        interval = setInterval(
                            function () {
                                if (!ispaused) {
                                    $('#timer').text(count += 1);
                                }
                            }, 1000
                        );
                        break;
                }
            }

            $(this).data("prevType", e.type);
        });

    });

发生的事情是全局间隔变量未填充,本地间隔(函数内部)变量是填充的变量。我已经在更新的小提琴上测试了它,似乎工作得很好;)