如何在Django模板中创建JavaScript计时器组件
我正在用Django创建一个在线考试。我用了一个倒计时的JavaScript计时器来显示时间到什么时候结束。
但是问题是:每次我切换到下一个问题的页面时,计时器都会重新开始。
有没有办法让时间在刷新页面后继续走?
这是我的模板代码(里面有计时器)
<form name="counter"><input type="text" size="8"
name="d2"></form>
<script>
<!--
//
var milisec=0;
var seconds={{time}};
document.counter.d2.value={{time}};
function display()
{
if (milisec<=0){
milisec=9
seconds-=1
}
if (seconds<=-1){
milisec=0
seconds+=1
}
else
milisec-=1
document.counter.d2.value=seconds+"."+milisec
setTimeout("display()",1000)
}
display()
-->
</script>
提前谢谢你!
4 个回答
使用会话来存储日期和时间。
你首先需要创建一个变量,如果它还不存在的话,比如:
import datetime
#Store the current time in session
if 'time_started' not in request.session:
request.session['time_started'] = datetime.datetime.today()
要读取这个值,你只需要使用
time_started = request.session['time_started']
如果你需要删除这个时间变量,可以使用这个:
del request.session['time_started'] #delete time_started variable in session
我做了以下这些事情。
你知道测试开始的时候,以及他们需要多长时间来完成测试。所以当测试开始时,计算出预计结束的时间,并把这个时间存储在某个地方(比如数据库)。然后把结束时间作为一个变量传递给模板,在你的JavaScript中使用它来计算剩余时间。因为结束时间在每个页面都是一样的,所以你不需要担心在不同的表单之间传递值。
如果你在表单之间传递值或者设置cookies,那么就很容易让人黑进测试,给自己增加时间。把这个值隐藏起来,不在页面上改变,会让黑客攻击变得稍微困难一些。他们还是可以黑掉JavaScript的计时器,但这没关系,因为每次提交问题后,你只需要检查当前时间是否超过了结束时间,如果超过了,就说明时间到了,可以结束测试。
如果你使用像 http://keith-wood.name/countdown.html 这样的jQuery插件,会让你的工作更轻松。
希望这些对你有帮助。
最简单的做法就是把当前的计时器值放在POST参数里,然后在下一页用这个计时器值重新启动计时器。
不过,使用ajax可能更好(可以通过像dajax这样的django库来实现),这样可以在一页上显示计时器(并且不断更新问题)。
另外,如果这个在线测试用于某种方式(比如作为课堂的测验成绩),你应该在服务器上记录初始和最终的时间戳,只根据这个时间差来计算(可能还要多给几秒钟,以应对通信延迟)。一般来说,你不能完全信任运行的javascript没有被修改。虽然它可以作为一个方便的工具,让他们知道还有多少时间,但要记住,所有客户端的javascript都很容易被用户修改,以便给自己更多的时间。