2012-06-27 56 views
0

我正在開發一個測驗應用程序在PHP和Javascript。測驗在用戶點擊提交按鈕時開始(我不控制測驗何時開始)。測驗應該在特定時間後停止(我決定)。 我不想完全依靠客戶端計算機來停止時間,因爲客戶端pc的時間可以改變。 測驗不應該在刷新頁面時重新啓動。在Javascript和php中實現計時器的最佳方法

我知道setInterval和基本的JavaScript。我迄今爲止開發的功能非常完美,但是測試會在頁面刷新時重新啓動。

function formatSecondsAsTime(secs) { 
    var hours = Math.floor(secs/3600); 
    var minutes = Math.floor(secs/60) - (hours * 60); 
    var seconds = secs - (hours * 3600) - (minutes * 60); 
    return hours + ':' + minutes + ':' + seconds; 
} 

function startTimer(mytime) { 
    mytime = mytime.split(":"); 
    hrs = mytime[0]; 
    parseInt(hrs, 10); 
    mins = mytime[1]; 
    parseInt(mins, 10) 
    secs = mytime[2]; 
    parseInt(secs, 10); 
    if (hrs > 0 || mins > 0 || secs > 0) { 
     timerVar = setInterval(function() { 
      if (secs > 0) //time is less than a minute 
      { 
       displayTime(hrs, mins, secs--); 
      } 
      else if (secs == 0 && mins > 0) { 

       displayTime(hrs, mins = mins - 1, secs = secs + 59); 
      } 
      else if (secs == 0 && mins == 0 && hrs > 0) { 
       displayTime(hrs--, mins = mins + 59, secs = secs + 59); 
      } 
      else if (secs == 0 && mins == 0 && hrs == 0) { 
       clearTimeout(timerVar); 
       displayTime(0, 0, 0); 
      } 
     }, 1000); 
    } 
    else { 
     displayTime(0, 0, 0); 
    } 
} 


function displayTime(hrs, mins, secs) { 
    if (secs > 0 || hrs > 0 || mins > 0) { 
     if ((secs.toString()).length < 2) secs = "0" + secs; 
     if ((mins.toString()).length < 2) mins = "0" + mins; 
     if ((hrs.toString()).length < 2) hrs = "0" + hrs; 

     document.getElementById("quiztime").innerHTML = "Time remaining: " + hrs + ":" + mins + ":" + secs; 
    } 
    else { 
     document.getElementById("quiztime").innerHTML = "Quiz has ended!"; 
     alert("Quiz has ended. Click ok to continue."); 
     document.forms["answerForm"].submit(); 
    } 
} 

請給我建議最好的辦法。

謝謝。

+1

如果他們禁用JavaScript,怎麼辦? – j08691

+0

是的,這也是一種可能性! –

+0

,但不要擔心abt,如果用戶禁用了JavaScript,我會顯示一條錯誤消息。 –

回答

4

實現此目的的最佳方法之一是:在測驗開始時,向服務器發送一個AJAX請求,告訴您的PHP腳本它已啓動。您的PHP腳本應該爲該用戶保存一個會話變量,以保存開始時間。提交測驗時,請檢查以確保當前時間和會話存儲開始時間之間的差異不超過您允許的時間量。

會話變量不能被客戶端編輯或查看。如果客戶端在測驗中加載頁面,則根據會話中的開始時間將JS定時器數量設置爲任何剩餘時間。

+0

感謝這真的是一個有經驗的人的答案。我正在開發類似的希望,它對我有用。 – 2013-06-14 20:36:34

1

我建議您使用cookie來確定當前用戶是否在某些已開始的測驗中。即當用戶點擊提交時,您正在使用PHP設置cookie,並將開始時間記錄在數據庫中。每次用戶訪問該頁面時,您都會檢查該cookie並從數據庫中提取記錄。這就是爲什麼你會發現直到測驗結束還剩下多少時間。

+0

但cookies可以編輯! –

+0

我的意思是說cookie可以用來存儲用戶記錄的id在數據庫中的散列。所以,以後你將能夠匹配用戶。 – Krasimir

0

餅乾是記住開始時間的關鍵。設置開始時間在cookie中,在php中提交。同樣的時間應該寫入頁面的腳本元素(然後服務器和客戶端都會知道啓動時間)。爲了保護cookie,你可以在服務器端加密它。您可以通過將cookie中的值與js中的值進行比較來驗證開始時間是否未被篡改(測試完成時)。

如果頁面重新加載並存在cookie,請從cookie中提取時間,而不是設置新時間。

相關問題