如何在Django模板中创建JavaScript计时器组件

2 投票
4 回答
4565 浏览
提问于 2025-04-16 17:41

我正在用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 个回答

3

使用会话来存储日期和时间。

你首先需要创建一个变量,如果它还不存在的话,比如:

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
5

我做了以下这些事情。

你知道测试开始的时候,以及他们需要多长时间来完成测试。所以当测试开始时,计算出预计结束的时间,并把这个时间存储在某个地方(比如数据库)。然后把结束时间作为一个变量传递给模板,在你的JavaScript中使用它来计算剩余时间。因为结束时间在每个页面都是一样的,所以你不需要担心在不同的表单之间传递值。

如果你在表单之间传递值或者设置cookies,那么就很容易让人黑进测试,给自己增加时间。把这个值隐藏起来,不在页面上改变,会让黑客攻击变得稍微困难一些。他们还是可以黑掉JavaScript的计时器,但这没关系,因为每次提交问题后,你只需要检查当前时间是否超过了结束时间,如果超过了,就说明时间到了,可以结束测试。

如果你使用像 http://keith-wood.name/countdown.html 这样的jQuery插件,会让你的工作更轻松。

希望这些对你有帮助。

1

最简单的做法就是把当前的计时器值放在POST参数里,然后在下一页用这个计时器值重新启动计时器。

不过,使用ajax可能更好(可以通过像dajax这样的django库来实现),这样可以在一页上显示计时器(并且不断更新问题)。

另外,如果这个在线测试用于某种方式(比如作为课堂的测验成绩),你应该在服务器上记录初始和最终的时间戳,只根据这个时间差来计算(可能还要多给几秒钟,以应对通信延迟)。一般来说,你不能完全信任运行的javascript没有被修改。虽然它可以作为一个方便的工具,让他们知道还有多少时间,但要记住,所有客户端的javascript都很容易被用户修改,以便给自己更多的时间。

撰写回答