如何在django模板中创建一个计时器javascript组件

时间:2011-05-15 19:35:43

标签: javascript python django

我正在尝试使用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 个答案:

答案 0 :(得分:5)

这就是我所做的。

你知道他们何时开始测试,你知道他们需要多长时间,所以当测试开始时,计算预期的结束时间,并将其存储在某个地方(数据库等)。将结束时间作为变量传递给模板,并在javascript中使用它来计算剩余时间。由于结束时间在页面之间始终相同,因此您不必担心在表单之间传递值。

如果您在表单之间传递值或设置cookie,那么您将使某人很容易破解测试以给自己更多时间。在幕后存储该值并且不在页面上更改它将会更难以破解。他们仍然可以破解javascript计时器,但这很好,因为在提交每个问题后,您只需检查当前时间是否大于结束时间,如果是,那么您知道时间已过,您可以结束测试。

如果您使用像http://keith-wood.name/countdown.html这样的jquery插件,它也会让您的生活更轻松。

希望有所帮助。

答案 1 :(得分: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']

如果您需要删除time_started变量,可以使用:

del request.session['time_started'] #delete time_started variable in session

答案 2 :(得分:1)

我认为最简单的方法就是使用AJAX并替换当前页面中的表单。这样您就不必刷新,计时器将继续运行。它还会更快地加载下一个表单!

答案 3 :(得分:1)

最容易实现的是在POST参数中传递当前计时器值,并使用下一页上的计时器值重新启动计时器。

使用ajax可能更好(可能通过像dajax这样的django库)似乎是一种很好的方法,并且在一个页面上有计时器(在移动时不断更新问题)。

此外,如果以任何方式使用此在线测试(例如,作为课程的测验成绩),您应该在服务器上记录初始和最终时间戳,并且只记录该差异(可能需要额外几秒钟)说明沟通滞后)。一般来说,你不能相信javascript运行没有被改变。它仍然可以让他们知道还剩多少时间,但请记住,用户很容易修改所有客户端java脚本,以便给自己更多时间。