0

我正在用 php 和 Javascript 开发一个测验应用程序。当用户点击提交按钮时测验开始(我不控制测验何时开始)。测验应该在特定时间后停止(我决定)。我不想完全依赖客户端计算机来停止时间,因为客户端计算机时间可以更改。测验不应在页面刷新时重新启动。

我知道 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();
    }
}

请建议我最好的方法。

谢谢你。

4

3 回答 3

4

实现此目的的最佳方法之一如下:在测验开始时,向服务器发送 AJAX 请求,告诉您的 PHP 脚本它已启动。您的 PHP 脚本应该为保存开始时间的用户存储一个会话变量。在提交测验时,检查以确保当前时间与会话存储的开始时间之间的差异不大于您允许的时间量。

客户端无法编辑或查看会话变量。如果客户端在测验中间加载页面,则根据会话中的开始时间将 JS 计时器数量设置为剩余时间。

于 2012-06-27T21:01:51.330 回答
1

我建议您使用 cookie 来确定当前用户是否在某个开始的测验中。即当用户单击提交时,您正在使用 PHP 设置 cookie 并在数据库中记录开始时间。每次用户访问该页面时,您都会检查该 cookie 并从数据库中获取记录。这样您就可以知道距离测验结束还剩多少时间。

于 2012-06-27T20:41:26.423 回答
0

Cookie 是记住开始时间的关键。在 cookie 中设置开始时间,在 php 中提交。这同一时间应该在脚本元素中写入页面(然后服务器和客户端都将知道开始时间)。为了保护 cookie,您可以在服务器端对其进行加密。可以通过比较cookie中的值和js中的值(测试完成时)来验证开始时间没有被篡改。

如果页面重新加载并且 cookie 存在,请从 cookie 中提取时间而不是设置新时间。

于 2012-06-27T20:58:52.263 回答