日期:2014-05-16  浏览次数:20439 次

倒计时,即使刷新也没事
function begin(totalTime){
 
 var begin=new Date();
 var hourB = begin.getHours();
 var minuteB=begin.getMinutes();
 var secondB=begin.getSeconds();
 //截止时间
 var deadline = new Date();
 var hourD = hourB+totalTime/60;
 var minuteD = minuteB+totalTime%60;
 var secondD=secondB;
 //alert("开始时间:"+hourB+":"+minuteB+":"+secondB+"结束时间:"+hourD+":"+minuteD+":"+secondD);
 timer = setInterval("countDown(hourD,minuteD,secondD)", 1000);
 }
//倒计时
 function countDown(hourD,minuteD,secondD) {
 var now=new Date();
 var hour = now.getHours();
 var minute=now.getMinutes();
 var second=now.getSeconds();
 
 var leftTime=(hourD-hour)*60*60+(minuteD-minute)*60+(secondD-second);//单位:秒
 //alert("剩余时间:"+leftTime);
 if (leftTime >= 0) {
minutes = Math.floor(leftTime / 60);
seconds = Math.floor(leftTime % 60);
msg = minutes + "分" + seconds + "秒";
document.all["timer"].innerHTML = msg;
if (leftTime == 5 * 60)
alert('注意,还有5分钟!');
--leftTime;
} else {
clearInterval(timer);
alert("时间到,结束!");

}


点击按钮时,触发begin(totalTime)函数
不知道哪里错了,alert("开始时间:"+hourB+":"+minuteB+":"+secondB+"结束时间:"+hourD+":"+minuteD+":"+secondD);显示的正确,alert("剩余时间:"+leftTime);没有显示
我的思路是:
//倒计时,为了防止刷新时重新计时,当点击开始时,记下当前时间
//获得的有考试总时长,当前时间+考试总时长就是结束时间,
//然后根据结束时间来倒计时

------解决方案--------------------
你的变量这么写是不正确的
setInterval("countDown(hourD,minuteD,secondD)", 1000);

另外,要刷新仍可计时,你需要把当前的时间记录到cookie里面

在线考试可以采取ajax方法提交,或者采用隐藏的iframe接收数据,可避免页面刷新


------解决方案--------------------
timer = setInterval(function(){countDown(hourD,minuteD,secondD);}, 1000);

如果用户刷新页面的话,刷新的时候提示会自动提交试卷,存在cookie里面也可以删除了,如果用ajax来记录用户做了多久,就会很多无用的请求,而且刷新后,还要把刚才用户做的结果给还原,麻烦。
------解决方案--------------------
每打开一次页面就去session那里找个开始考试的时间,没有就是now,并存入session。
------解决方案--------------------
倒计时,为了防止刷新时重新计时,当点击开始时,记下当前时间
================================================
这一块功能放服务器,用session保存。别的功能要用到时间的都去session里找。