Это странный вариант, пожалуйста, не стесняйтесь редактировать вопрос или запрашивать дополнительную информацию, если я не предоставил всю информацию.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>
@RamRaider, вы имеете в виду 'stayTime'? не являются ли глобальные переменные плохой практикой? – bg17aw
Итак, после того, как закончилось время, вы должны «clearInterval», поэтому он больше не работает. –
@u_mulder, clearInterval прямо перед отправкой(), похоже, исправил эти проблемы. Благодарю. – bg17aw