与jquery形成问题

时间:2011-05-14 17:47:44

标签: php jquery forms

场景是我正在生成测试。倒计时钟。倒计时结束后,表格将被提交。

所以目前如果我正常完成测试等,并自己提交我的结果,一切正常。

这是我在倒计时结束时触发表单提交的声明:

if(Todays_Date >= Target_Date){
        alert("Timeup, Submitting exam....");
        clearTimeout(timeoutID);
        $("form#testForm").submit();
    }

我目前得到的是if语句成功触发并弹出警报,但似乎没有其他事情发生,即它没有导航到操作页面。

表格详情:

<form id="testForm" method="post" action="add_responses.php">

现在我是一个菜鸟,所以使用submit()实际上并不遵循操作页面吗?我是否必须告诉软件发送到页面或什么? (窗口位置等)

非常感谢,

编辑:添加了更多代码:

// TEST COUNTDOWN CLOCK
function countdown(timestamp) {
    timetarget = new Date(timestamp);

    var Today = new Date();

    var Todays_Date = Today.getTime();
    var Target_Date = timetarget.getTime();

    var tester = new Date(Target_Date);

    //Find their difference, and convert that into seconds.
    var Time_Left = Math.round((Target_Date - Todays_Date) / 1000);

    if(Todays_Date >= Target_Date){
        clearTimeout(timeoutID);
        $("form#testForm").submit();
        alert("Timeup, Submitting exam....");
    }

    //More datailed.
    days = Math.floor(Time_Left / (60 * 60 * 24));     
    Time_Left %= (60 * 60 * 24);
    hours = Math.floor(Time_Left / (60 * 60));
    Time_Left %= (60 * 60);
    minutes = Math.floor(Time_Left / 60);
    Time_Left %= 60;
    seconds = Time_Left;

    if(hours == 0 && minutes < 10){
    document.getElementById('countdown').style.color='red';
        }

    if (seconds < 10) {
        seconds = '0' + seconds;
    }
    if (minutes < 10) {
        minutes = '0' + minutes;
    }

    html = hours + ':' + minutes + ':' + seconds + ' secs';

    document.getElementById('countdown').innerHTML = html;

    //Recursive call, keeps the clock ticking.
    var timeoutID = setTimeout(function() { countdown(timestamp); }, 1000);
}

2 个答案:

答案 0 :(得分:2)

<强>更新

我怀疑这是因为您放置了if语句的位置以及代码的一般顺序。

提交表单后,它会继续向下搜索代码并返回到setTimeout。

最简单的方法是在if;

中添加一个return语句
if(Todays_Date >= Target_Date){
    clearTimeout(timeoutID);
    $("form#testForm").submit();
    alert("Timeup, Submitting exam....");
    return; // <-- add this so the code below isn't excuted again.
}

正如一些附注所述,并且正如我的评论中所解释的那样,这种逻辑属于服务器端,因为依赖Javascript会对您的系统造成严重影响和缺陷:

  • 具有Javascript知识的用户可以破解您的系统,以便尽可能多地花时间完成考试:javascript:document.getElementById('testForm').setAttribute('id', 'i_want_as_much_time_as_i_like_to_complete_this_exam_mwuhahaha');

对于像这样的系统来说,这一点是不可接受的(除非这是一个愚蠢的调查问卷或一些无足轻重的问题,但对于真正的考试,例如单一工作或其他事情 - 需要认真重新思考)

替代

设计这样一个系统很有意思,因为你做了一些本能的侵入;要求用户在分配的时间内提交表格。但是,让我们进入视角;当你在真正的考试中没有分配你所拥有的时间时,就会设置简单。当你交作业;你有截止日期。当不满足时,运气不好。底线是用户必须负责及时提交他们的工作。

技术

  • 数据库&amp;服务器端逻辑:将截止日期存储在该特定用户的数据库中,与该考试ID相关。如果用户在此之后尝试提交,则服务器将不允许它。
  • 保存草稿/不丢失数据:在多个页面中拆分检查并强制用户提交以进入下一页。这意味着服务器到目前为止有机会保存考试状态。
  • 用户如何知道他们有多长时间&amp;后果:在每个页面都有一个固定的div栏,显示截止时间,因此用户确切知道他们已经有多长时间,并警告他们不按时提交表格的后果。
  • Javascript作为一个有礼貌的告密者和提交者:你可以继续做你在截止日期之后提交表格的事情,甚至在屏幕上运行的固定栏倒计时倒计时实时倒计时。不同之处在于服务器知道是否接受后来者;所以Javascript没有决定,用户也没有决定。

Example of informing the user how long they have left

答案 1 :(得分:0)

我会首先尝试清除超时,然后提交表单,然后显示警告:

if(Todays_Date >= Target_Date){
    clearTimeout(timeoutID);
    $("form#testForm").submit();
    alert("Timeup, Submitting exam....");
}

我认为您执行操作的顺序对您不利。