2016-02-11 3 views
0

Это странный вариант, пожалуйста, не стесняйтесь редактировать вопрос или запрашивать дополнительную информацию, если я не предоставил всю информацию.Javascript form submit создает огромное количество запросов POST (multiple submit)

У меня есть форма (приуроченная викторина), которая автоматически отправляется, если пользователь не отправил ее в фиксированный срок и обратный отсчет, отображаемый на странице.

Однако, когда время истекает и форма отправляется, браузер попадает в странное состояние, пока оно не раздавится, и в журнале Apache показан бесконечный список запросов POST. Что может быть причиной этого?

Даже после закрытия окна браузера сервер по-прежнему получает запросы POST.

Если я открою окно, Chrome в конечном итоге отобразит сообщение об ошибке, но запросы POST все равно появятся, спустя некоторое время после появления этого сообщения (я бы сказал, что через минуту после этого). Здесь можно увидеть эту ошибку вместе с файлом журнала Apache, который записывает запросы POST, входящие и исходящие: http://imgur.com/zAniD1q или если мне удастся вставить его здесь: ! http://imgur.com/zAniD1q

Это веб-сайт Wordpress, но в значительной степени настроенный мной. Мой .htaccess файл довольно простой, я не думаю, что это проблема.

Тот же код работает с другой частью сайта, что еще труднее понять.

Я также тестировал и получил то же поведение как на WAMP (Apache 2.2.22/PHP 5.4.3), так и на рабочем сервере под управлением PHP 5.5 (не уверен в версии Apache).

PHP:

define('REDIRECT_LINK', '/finish-free-iq-test.php'); 

Javascript:

function update_time_remaining() { 
    var start_time_millis = Math.floor(jQuery("#start_time").val()); 
    var redir_to = "<?php echo REDIRECT_LINK; ?>"; 
    var test_duration = <?php echo Question::get_duration($questionSetID) * 1000;?>; 
    var now = new Date(); 
    var remainingTime = test_duration - (now.getTime() - start_time_millis); 
    if (remainingTime <= 0) { 
//  console.log("time is out, redir to: " + redir_to); 
//  alert("stop="); 
     // force-submit the form 
     jQuery("#answerForm").attr("action", redir_to); 
     jQuery("#answerForm").submit(); 
    } 
    else { 
     var minutesRemaining = Math.floor(remainingTime/60000); 
     var secondsRemaining = Math.floor((remainingTime - minutesRemaining * 60000)/1000); 
     jQuery("#timer").html("Time remaining : " + (minutesRemaining<10?"0":"") + minutesRemaining + ":" + (secondsRemaining<10?"0":"") + secondsRemaining); 
     //console.log(secondsRemaining); 
    } 
} 

// Things to do once the page has loaded (start the clock for example) 
jQuery(document).ready(function() { 
    jQuery("#submitRow").hide(); 
    jQuery("#start_time").val(new Date().getTime() - <?php echo (time() - $timeStarted)*1000; ?>); 
    update_time_remaining(); 
    // check every half a second so the ticking is consistent looking. 
    window.setInterval("update_time_remaining()", 500); 

HTML:

<div id="timer"></div> <br/> 
<form id="answerForm" 
     method="POST" 
     action="<?php echo REDIRECT_LINK; ?>"> 

     <input id="submitRow" type="submit" name="go_next" value="Next question"> 

<?php echo "<input type=\"hidden\" name=\"current\" value=\"$id\">"; ?> 
<input type="hidden" name="answer" id="answer" value="-1"> 
<input type="hidden" name="start_time" id="start_time" value="<?php echo $jsTimeStarted; ?>"> 

</form> 
+0

@RamRaider, вы имеете в виду 'stayTime'? не являются ли глобальные переменные плохой практикой? – bg17aw

+2

Итак, после того, как закончилось время, вы должны «clearInterval», поэтому он больше не работает. –

+0

@u_mulder, clearInterval прямо перед отправкой(), похоже, исправил эти проблемы. Благодарю. – bg17aw

ответ

2

На первый взгляд, это выглядит, как у вас нет ничего, что останавливает «update_time_remaining () ", который вызывается на интервале 500 мс.

Это означает, что проверка «if (ОсталосьTime < = 0) {» вызывается непрерывно, даже после того, как таймер опускается ниже нуля, и приводит к повторным сообщениям до тех пор, пока страница не будет выгружена.

Возможно включать логический флаг, который позволяет следующее только вызывается один раз:

jQuery("#answerForm").submit(); 

Хорошим решением было бы удалить интервал, который вызывает «update_time_remaining()» после того, как Представлять был вызван.

В качестве дополнительной заметки помните, что, поскольку это проверка времени только для javascript, кто-то с достаточным опытом (и временем) может просто отключить проверку и отправить ответы, когда захочет. Хорошим решением для этого будет проверка того, сколько времени человек взял, чтобы ответить на вопрос на стороне сервера.

+0

хороший, хип-хоп, похоже, что ты на правильном пути. Можете ли вы объяснить, что означает «страница разгружена»? Спасибо – bg17aw

+0

Кроме того, не уверен, как этот код работает на другой странице сайта ... Он отображает другой тест, но все точно так же функционально и работает. Но вы правы, функция вызывается и продолжается. – bg17aw

+0

По разгрузке я имею в виду, что браузер больше не запускает javascript на этой странице, либо вкладка была закрыта, либо они перешли на другую страницу на сайте. – Hiphop03199