Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript脚本计时器问题_Javascript_Jquery - Fatal编程技术网

Javascript脚本计时器问题

Javascript脚本计时器问题,javascript,jquery,Javascript,Jquery,我正试着做一个倒计时。我设法制作了一个,但问题是当我关闭浏览器时,它停止了。所以当用户重新访问我的站点时,它会重新启动。我想要的是保持那个计时器。例如,如果用户在计时器22:14:09离开我的站点。所以计时器将继续。假设用户在一小时后再次访问我的站点,那么时间应该是21:14:09。我该怎么做 这是我的JS $(function () { var hrs, mins, secs, TimerRunning, TimerID, Timer = { init: functio

我正试着做一个倒计时。我设法制作了一个,但问题是当我关闭浏览器时,它停止了。所以当用户重新访问我的站点时,它会重新启动。我想要的是保持那个计时器。例如,如果用户在计时器22:14:09离开我的站点。所以计时器将继续。假设用户在一小时后再次访问我的站点,那么时间应该是21:14:09。我该怎么做

这是我的JS

$(function () {
var hrs, mins, secs, TimerRunning, TimerID,
    Timer = {
        init: function () {
            hrs          = 23;
            mins         = 59;
            secs         = 59;
            TimerRunning = false;
            Timer.StopTimer();
            Timer.StartTimer();
         },

         StopTimer: function () {
            if(TimerRunning)
               clearTimeout(TimerID);
            TimerRunning=false;
         },

         StartTimer: function () {
            TimerRunning = true;
            $('.timer').html(Timer.Pad(hrs) + ":" + Timer.Pad(mins) + ":" + Timer.Pad(secs));
            TimerID = self.setInterval("StartTimer()", 1000);

            if(hrs == 0 && mins == 0 && secs == 0)
               StopTimer();

            if (secs == 0) {
               mins--;
               secs = 59;
            }
            if (mins == 0) {
                hrs--;
                mins = 59;
            }
            secs--;
            setTimeout(function () { Timer.StartTimer(); }, 1000);
         },

         Pad: function (number) {
            if(number < 10)
               number = 0+""+number;
            return number;
         }

    };

Timer.init();
});
$(函数(){
变量小时、分钟、秒、计时、计时,
计时器={
init:函数(){
hrs=23;
分钟=59;
秒=59;
TimerRunning=false;
Timer.StopTimer();
Timer.StartTimer();
},
停止计时器:函数(){
如果(定时)
清除超时(TimerID);
TimerRunning=false;
},
StartTimer:函数(){
TimerRunning=true;
$('.timer').html(timer.Pad(hrs)+“:”+timer.Pad(min)+“:”+timer.Pad(secs));
TimerID=self.setInterval(“StartTimer()”,1000);
如果(小时==0和分钟==0和秒==0)
停止计时器();
如果(秒=0){
分钟--;
秒=59;
}
如果(分钟==0){
小时--;
分钟=59;
}
秒--;
setTimeout(函数(){Timer.StartTimer();},1000);
},
Pad:功能(编号){
如果(数字<10)
数字=0+“”+数字;
返回号码;
}
};
Timer.init();
});
更新


您可以将时间存储在
LocalStorage
中,并且它将在浏览器重新启动时保持不变

在你的情况下,简单到

localStorage["mytimer"] = JSON.stringify([hrs, mins, secs]);
应该可以用于存储,你可以这样做

var previousTime = JSON.parse(localStorage["mytimer"]);
检索上一个值


您可以在此处阅读更多信息:。

您可以修改StartTimer函数,以便每次调用它时,都将其保存在cookie或localStorage中。此外,setTimeout不是很可靠,您应该不时地实时调整时间计数。

这是我解决这个问题的方法

// use hours, minutes & seconds to set time limit
var hours = 1, 
    minutes = 30, 
    seconds = 0,
    maxTime =  ( ( hours * 3600 ) + ( minutes * 60 ) + seconds ) * 1000,
    // if timeleft not in localStorage then default to maxTime
    timeLeft = ( localStorage.timeLeft || maxTime ),
    startTime = new Date(),
    intervalRef;

// check if user has already used up time
if( timeLeft > 0 ) {

    intervalRef = setInterval( setTimeLeft, 5000 );
} else {

    stopTrackingTime();
}

function setTimeLeft( ) {

    // if user has used up time exit
    if( localStorage.timeLeft < 0 ) {

        stopTrackingTime();
    }

    // calculate how long user has left
    var elapsed = ( new Date() - startTime );
    localStorage.timeLeft = timeLeft - elapsed;
};

// function called once user has used up time
function stopTrackingTime( ) {

    clearInterval( intervalRef );
    alert( "end of time allowed" );
}
//使用小时、分钟和秒设置时间限制
var小时=1,
分钟=30,
秒=0,
最大时间=((小时*3600)+(分钟*60)+秒)*1000,
//如果timeleft不在localStorage中,则默认为maxTime
timeLeft=(localStorage.timeLeft | | maxTime),
startTime=新日期(),
intervalRef;
//检查用户是否已用完时间
如果(时间间隔>0){
intervalRef=setInterval(setTimeLeft,5000);
}否则{
stopTrackingTime();
}
函数setTimeLeft(){
//如果用户已用完时间,则退出
if(localStorage.timeLeft<0){
stopTrackingTime();
}
//计算用户离开的时间
var已用=(新日期()-startTime);
localStorage.timeLeft=timeLeft-已用时间;
};
//用户用完时间后调用的函数
函数stopTrackingTime(){
clearInterval(intervalRef);
警报(“允许的时间结束”);
}

Fiddle

将计时器移到服务器端。您能详细说明一下您的答案吗?这里不需要任何服务器端。只需在页面卸载上设置cookie。请查看我的斜体更新帖子。很抱歉造成混淆。请查看我的斜体更新帖子。这就是我想要的want@al0ne只需将在站点上花费的时间存储在本地存储中,而不是当前时间
localStorage[“timespunt”]=JSON.stringify([hrsSpent,minspunt,secsSpent])
@Bruno我添加了这两行代码,但仍然无法按照我想要的方式工作
localStorage[“mytimer”]=JSON.stringify([hrs,mins,secs]);var previousTime=JSON.parse(localStorage[“mytimer”]);//$('.timer').html(timer.Pad(小时)+“:”+timer.Pad(分钟)+“:”+timer.Pad(秒));$('.timer').html(以前的时间)它仍然从一开始就重新启动。请注意,使用本地存储(cookie或html5本地存储)会打开代码,用户可以手动调整计时器数据。如果您正在编写考试或其他需要计时器周围安全性的内容,请不要使用本地存储。