代码之家  ›  专栏  ›  技术社区  ›  Furunomoe

Web应用程序中的计时器

  •  0
  • Furunomoe  · 技术社区  · 14 年前

    我正在尝试用cakephp创建一个基于Web的测试(如在考试中)应用程序。

    启动测试时,Web服务器将在会话中存储确切的开始时间。当测试结束,客户端向Web服务器提交答案时,Web服务器将用上一个开始时间重新检查提交时间。如果总试验时间在规定的误差范围内(如5分钟),试验结果将被接受。

    我已经完成了这个部分,目前正在使用 jQuery Countdown Plugin 在客户机(浏览器)中显示计时器。此计时器还用于在表单过期时自动提交表单。

    问题是刷新页面会重置计时器。来回走也会这样做(因为它本质上是令人耳目一新的)。

    尽管在服务器中记录和验证了所用的总测试时间(如果用户篡改了计时器并提交了测试,系统将拒绝它),但是否仍有防止这种情况发生的方法,或者至少给出警告,或者更好的方法是,在用户篡改时自动提交测试(当然会拒绝哪个测试)?

    我知道我可以通过使用Ajax来做到这一点(这方面我还是个初学者),但是由于带宽限制(我不这么认为),高层告诉我不要这样做。所以…有人吗?

    谢谢!

    2 回复  |  直到 14 年前
        1
  •  0
  •   Travis Leleu    14 年前

    首先,所需的不是Ajax,而是让服务器在页面加载时设置客户端计时器的概念。是的,您可以通过Ajax来实现这一点——让客户机在document.ready()上请求当前时间。但是,除非您需要额外的同步功能(这实际上打开了另一个蠕虫病毒罐),否则当您可以从原始服务器提供的页面设置此值时,没有理由通过Ajax进行单独的HTTP请求。

    因此,如果您的页面是/examController::page()方法中的/examController/page,则可以执行以下操作:

    $this->set( 'cur_time', date( 'N-d-Y', strtotime() );
    

    然后在渲染的视图中,让它执行如下操作:

    <?php echo $cur_time; ?>
    

    将该代码段包装在一个javascript代码块中,该代码块将设置一个JS变量来启动jquery计数器,该计数器可以在页面完成加载后再次开始计数。这里没有额外的带宽!

        2
  •  1
  •   Rubens Farias    14 年前

    您需要获取服务器当前时间和测试开始时间。同时减去这两个值,您将得到用户已经花在测试中的时间。现在,只需从您的时间限制(5分钟)中减去这个值,您就有剩余的时间;小于零的值表示测试时间结束。