im 尝试使用 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>
提前致谢
这就是我所做的。
你知道他们什么时候开始测试,你知道他们必须花多长时间,所以当测试开始时,计算预期的结束时间,并将其存储在某个地方(数据库等)。将结束时间作为变量传递给模板,并在 javascript 中使用它来计算剩余时间。由于页面之间的结束时间始终相同,因此您不必担心在表单之间传递值。
如果您在表单之间传递值或设置 cookie,那么您将使某人很容易破解测试以给自己更多时间。将该值存储在幕后而不在页面上更改它将使黑客更难破解。他们仍然可以破解javascript计时器,但这很好,因为在提交每个问题后,您只需检查当前时间是否大于结束时间,如果是,则您知道时间已过期,您可以结束测试。
如果您使用像 http://keith-wood.name/countdown.html 这样的jquery插件,它也会使您的生活更轻松。
希望有帮助。
使用会话存储日期\时间。
如果变量不存在,则首先创建一个变量,例如:
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
最简单的实现方法是在 POST 参数中传递当前计时器值,然后在下一页上使用该计时器值重新启动计时器。
最好使用 ajax(可能通过像 dajax 这样的 django 库)似乎是一个不错的方法,并将计时器放在一个页面上(随着问题的移动不断更新)。
此外,如果以任何方式使用此在线测试(例如,作为班级的测验成绩),您应该在服务器上记录初始和最终时间戳,并仅通过该差异(可能会额外提供几秒钟来解释通信延迟)。 一般来说,你不能相信运行的javascript没有被改变。 为了方便起见,他们仍然可以知道还剩多少时间,但请记住,所有客户端 java 脚本都很容易被用户修改,以便给自己更多的时间。
在我看来,最简单的方法是使用 AJAX 并替换当前页面中的表单。这样,您就不必刷新,计时器将继续运行。它也会更快地加载下一个表单!