2011-05-15 36 views
0

即時通訊嘗試使用Django創建在線考試。我用倒計時的JavaScript計時器來告訴什麼時候完成。如何在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> 

在此先感謝

+0

你可以使用Javascript來設置一個cookie,但如果這是一個在線考試,那不會窩很好。當用戶進入下一頁時,用戶是否點擊按鈕併發送表單?您可以通過POST參數發送該值並在下一頁中選擇它。 – tlunter 2011-05-15 19:38:49

回答

1

最簡單的實現方法是隻傳遞POST參數中的當前計時器值,然後使用下一頁的計時器值重新啓動計時器。

它可能更好地使用ajax(可能通過像django庫像dajax)似乎是一個很好的方式去,並有一個頁面上的計時器(不斷更新問題,因爲他們沿着)。另外,如果以任何方式使用這個在線測試(例如,作爲一個類的測驗等級),你應該記錄服務器上的初始和最終時間戳,並且僅僅根據這個差異(可能給出幾秒鐘的額外時間以解決溝通滯後)。一般來說,你不能相信JavaScript運行沒有被改變。爲了讓他們知道剩下多少時間,它仍然存在,但請記住,用戶可以輕鬆修改所有客戶端java腳本以給自己更多時間。

1

最簡單的方法在我的腦海裏,是隻使用AJAX和替換形式在當前頁面。這樣你不必刷新,計時器將繼續運行。它也會加載下一個表單更快!

4

這就是我所做的。

你知道他們什麼時候開始測試,你知道他們需要多久,所以當測試開始時,計算預期的結束時間,並存儲在某個地方(數據庫等)。將結束時間作爲變量傳遞給模板,並在JavaScript中使用該時間來限制剩餘時間。由於頁面之間的結束時間總是相同,因此您不必擔心在表單之間傳遞值。

如果您在表單之間傳遞值或設置cookie,那麼您將使得有人爲了給自己更多時間而破解測試變得非常容易。將該值存儲在幕後,而不是在頁面上進行更改會使得更難以破解。他們仍然可以破解JavaScript計時器,但這很好,因爲在提交每個問題後,您只需檢查當前時間是否大於結束時間,如果是,那麼您知道時間已過,並且可以結束測試。

如果您使用像http://keith-wood.name/countdown.html這樣的jquery插件,它也會讓您的生活更輕鬆。

希望有所幫助。

1

使用會話來存儲日期\時間。

首先創建一個變量,如果它不存在,例如:

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 
相關問題