Как перенаправить пользователя с таймером

0

Выполняя викторину, я хотел бы задать ограниченное время для ответа на вопросы.

Поэтому пользователю просто нужно поставить свой ответ в форме и проверить. Validate будет перенаправляться на страницу process.php, которая будет проверять все.

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

Я знаю, что есть какой-то способ: метатег (html) или заголовок (php), но это не совсем то, что я ищу, причина настройки кода или соображения безопасности.

На самом деле, я получил этот код.

<p>You will be redirected in <span id="counter">10</span> second(s).</p>
<script type="text/javascript">
function countdown() {
    var i = document.getElementById('counter');
    if (parseInt(i.innerHTML)<=0) {
        location.href = 'process.php';
    }
    i.innerHTML = parseInt(i.innerHTML)-1;
}
setInterval(function(){ countdown(); },1000);
</script>

Но это не то, что я ищу, потому что пользователь может легко изменить таймер, чтобы установить большее значение.

Я также посмотрел PHP функцию microtime(), чтобы поместить ее в сеанс и проверить мой process.php, если таймер не изменился. Но я потерпел неудачу.

  • Есть ли простой способ решить эту проблему?
  • Как реально обеспечить время ответа и предотвратить смену таймера?
  • 0
    Вы не можете предотвратить это на клиенте. Вам нужно будет отслеживать время на сервере и помнить, что для перемещения запросов по проводам и загрузки страницы требуется время, поэтому в PHP это НЕ 10 секунд.
  • 0
    Вы хотите сделать это только через javascript ?? .... Также возможно использовать HTML, например, так: <meta http-equiv="refresh" content="10;url=http://www.google.com/" /> , чтобы перенаправить через 10 секунд ..
Показать ещё 6 комментариев
Теги:
timer
redirect

2 ответа

1
Лучший ответ
  1. Единственный способ обойти пользователя от "обмана" его выхода из таймера - сделать таймер зависимым от времени сервера. Это означает, что вы должны иметь некоторые данные, переданные сервером. например, каждый раз, когда пользователь начинает отвечать на вопрос, задайте объект сеанса (или что-то подобное), а затем очистите его, когда пользователь закончит отвечать на него. Поэтому, когда пользователь начинает отвечать на вопрос, проверьте, существуют ли данные, и подсчитайте оставшееся время.
  2. Если вы не хотите, чтобы таймер зависел от сервера, вы можете сделать функцию анонимной. Когда функция анонимна, вы можете получить некоторый уровень секретности.

,

function(){
    var a = setInterval(function(){ 
        i = document.getElementById('counter');
        if (parseInt(i.innerHTML)<=0) {
            clearInterval(a);
            document.getElementById('formName').submit();
        }
        i.innerHTML = parseInt(i.innerHTML, 10) - 1;
     },1000);
}();
  • 0
    Спасибо за этот ответ. Это то, о чем я думал, кроме анонимной функции. Но о времени сервера, UTC или времени загрузки не будет проблемой?
  • 0
    Время загрузки будет иметь влияние. Вы почти не можете этого избежать. Вы должны обработать время ошибки до 1-2 секунд.
1

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

// When DOM is fully loaded
$(function() {
    var countDown = 5000;

    // Will occur after "countDown" / 1000 seconds
    setTimeout(function() {
            $("#theQuizzForm").submit();
        },
        countDown
    );
});

Предполагая, что ваша form имеет следующий вид:

<form method = "whatever" action="process.php">
    <!-- html elements -->
</form>

Использование setTimeout отправит форму после countDown/1000 секунд, которая составляет 5 секунд.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню