禁止用户按下或刷新

时间:2011-07-06 22:56:01

标签: php javascript

我正在创建一个用户测验,每个问题的时间为3分钟。我怎样才能让用户无法按下或刷新,或者即使他们按下也没有任何反应,或者如果他们按下它就会得到一个消息,他们将获得0分。我尝试了一个警告框,但是当警报框打开时,时钟停止。任何人都知道如何实现这一目标?

4 个答案:

答案 0 :(得分:2)

您可以尝试使用数据库而不是javascript来强制执行时间限制。

+-------+-----------+----------+--------+------+
|user_id|question_id|start_time|end_time|answer|
+-------+-----------+----------+--------+------+

你必须确保(user_id, question_id)是唯一的,如果他们花费的时间超过3分钟,他们就会得到0。

这也可以让你阻止他们多次回答同一个问题。

答案 1 :(得分:0)

后退按钮行为取决于用户/浏览器,这意味着无法禁用后退按钮本身。有几种解决方法,例如打开一个新窗口并从父窗口引用计数器。但是禁用后退按钮本身是不可能的

答案 2 :(得分:0)

正如其他地方所建议的那样,您无法覆盖后退或刷新行为。但是,您可以在用户尝试离开页面时执行操作(例如弹出消息):

<body onbeforeunload="return confirm( 'If you leave this page, you will receive 0 points. Stay on page?' );">

请注意,此类干扰对用户来说很烦人,不应该用于一般受众。然而,在权威性测验的背景下,这可能是可以接受的。

另请注意,某些浏览器(例如Opera)不支持onbeforeunload.您可能需要限制测试者可以使用的浏览器。

答案 3 :(得分:0)

如果您存储会话中显示的当前问题,即使用户点击它,也会始终显示他们所在的问题。

但这显然会重置(javascript)计时器。为了解决这个问题,请在同一会话中显示问题时存储时间戳,并确认在提交时可能是个主意。将其与George Cummins所述的javascript“onbeforeunload”相结合,告知用户他们行动的后果。

所以,在加载问题时:

$_SESSION['current_question']['id'] = $question['id'];
$_SESSION['current_question']['timestamp'] = time();

提交答案时:

if((time() - $_SESSION['current_question']['timestamp']) =< 180)
{
    // Decide the amount of points earned
    $score = ...
}
else
{
    // User took more than 3 minutes, set score to 0;
    $score = 0;
}