проблема формы с jquery - PullRequest
1 голос
/ 14 мая 2011

Сценарий: я создаю тест. Есть часы обратного отсчета. По завершении обратного отсчета форма отправляется.

так что в настоящее время, если я закончу тестирование и т. Д., И отправлю свои результаты сам, все будет нормально.

это мое утверждение, которое вызывает отправку формы, когда отсчет истекает:

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

что я сейчас получаю, это если оператор срабатывает успешно, и появляется всплывающее предупреждение, но, похоже, больше ничего не происходит, т.е. он не переходит на страницу действия.

детали формы:

<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 ]

2 голосов
/ 14 мая 2011

Обновление:

Как я и подозревал, это из-за того, где вы разместили оператор if, и общего порядка кода.

Как только форма отправлена, она продолжает код и возвращается к setTimeout.

Самое простое, что нужно сделать, это просто добавить выражение возврата в ваш if;

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');

Один этот пункт просто неприемлем для системы, подобной этой (если это не глупая анкета или что-то незначительное, но для реальных экзаменов, таких как работа в университете или что-то еще, - она ​​требует серьезного переосмысления)

альтернатива

Что ж, интересно спроектировать такую ​​систему, как эта, потому что вы делаете что-то инстинктивно навязчивое; Требование пользователя отправить свою форму в отведенное время. Но давайте рассмотрим это в перспективе; когда вы на настоящем экзамене вы не распределяете время, которое у вас есть, оно устанавливается просто. Когда вы сдаете курсовую работу; у вас есть срок. Когда это не встречается, неудача. Итог: пользователь должен взять на себя ответственность за своевременную подачу работы.

Методы

  • База данных и логика на стороне сервера: Сохраните дату крайнего срока в базе данных для этого конкретного пользователя, в соответствии с этим идентификатором экзамена. Если пользователь попытается отправить после этого времени, сервер просто не разрешит это.
  • Сохранение черновиков / отсутствие потери данных: Разделение экзамена на несколько страниц и принуждение пользователя к отправке для перехода на следующую страницу. Это будет означать, что сервер имеет шанс сохранить состояние экзамена.
  • Как пользователь знает, сколько у него времени и последствия: На каждой странице есть фиксированная строка div, которая показывает время окончания, поэтому пользователь точно знает, сколько времени он получил, и предупреждает его о последствия несвоевременной подачи формы.
  • Javascript как вежливый информатор и отправитель: Вы можете продолжать делать то, что делаете, отправляя форму по истечении крайнего срока, и даже иметь обратный отсчет на фиксированной панели, бегущей по экрану, который ведет обратный отсчет в режиме реального времени Разница в том, что сервер знает, принимать опоздавших или нет; поэтому Javascript не решает и пользователь не принимает.

Example of informing the user how long they have left

0 голосов
/ 14 мая 2011

Я бы попытался сначала очистить тайм-аут, затем отправить форму и после этого отобразить предупреждение:

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

Я думаю, что порядок, в котором вы выполняли операции, работал против вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...