2011-07-06 27 views
1

我正在創建一個用戶測驗,每個問題的測試時間爲3分鐘。我該如何做到這一點,以便用戶無法按下或刷新,或者即使他們按下它也不會發生任何事情,或者他們得到一條消息,如果他們按下它,他們將獲得0分。我嘗試了一個警告框來做到這一點,但當警報框打開時鐘停止。任何人都知道如何實現這一目標?禁止用戶按下或刷新

+5

你不應該,當用戶想離開,他/她應該能夠 – Ibu

回答

0

後退按鈕的行爲取決於用戶/瀏覽器,這意味着無法禁用後退按鈕本身。有幾種解決方法,例如打開一個新窗口並從父窗口引用計數器。但禁用後退按鈕本身不可能

0

正如其他地方所建議的,您不能覆蓋後退或刷新行爲。但是,您可以執行操作(如彈出一個消息)時,他們試圖離開頁面的用戶:

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

請注意,這種類型的干擾是惱人的用戶,不應該使用在一般的觀衆。然而,在權威測驗的背景下,這可能是可以接受的。

另請注意,某些瀏覽器(例如Opera)不支持onbeforeunload.您可能需要限制測試者可以使用的瀏覽器。

2

您可以嘗試使用數據庫而不是JavaScript來強制實施時間限制。

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

你只需要確保(user_id, question_id)是獨一無二的,如果他們需要超過3分鐘,他們的問題得到了0。

這也可以讓你阻止他們多次回答同一個問題。

+1

這就是唯一的解決方案不要在客戶端做這樣的事情。 – ThiefMaster

+0

即使使用服務器端代碼,也要考慮用戶可能經常無法在Internet中完全識別的可能性。所以如果有人有兩次登錄,這個用戶仍然會繞過你的陷阱。 – BurninLeo

+1

@BurninLeo你說的是非常真實的,很難唯一地標識一個用戶,但是從嘗試使用JavaScript保持用戶在頁面上來看,這仍然是一個巨大的進步。 –

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; 
}