Таймер проверки Javascript

#javascript #html

#javascript #HTML

Вопрос:

Привет, я создаю викторину, используя javascript, но изо всех сил пытаюсь установить функционирующий таймер обратного отсчета. Это может быть простой вопрос, но как я могу сделать так, чтобы, как только таймер достигнет нуля, он отправлял тест и сообщал пользователю о времени выполнения? Я пробовал несколько разных способов, но безрезультатно. Любая помощь приветствуется.

Мой код для таймера обратного отсчета:

 <script>

var total_seconds = 30*1;
var c_minutes = parseInt(total_seconds/60);
var c_seconds = parseInt(total_seconds%60);

function CheckTime(){
document.getElementById("quiz-time-left").innerHTML
= 'Time Left: '   c_minutes   ' minutes '   c_seconds   ' seconds ' ;

if(total_seconds <=0){
setTimeout('document.quiz.submit()',1);
} else {
total_seconds = total_seconds -1;
c_minutes = parseInt(total_seconds/60);
c_seconds = parseInt(total_seconds%60);
setTimeout("CheckTime()",1000);
}}
setTimeout("CheckTime()",1000);
</script> 
  

Мой код для викторины:

     <form name="form" onsubmit="return score()">
    <h3>1. How many yellow cards equal a red card in football?</h3>
    <input type="radio" name="q1" value="a">a. 1<br>
    <input type="radio" name="q1" value="b">b. 2<br>
    <input type="radio" name="q1" value="c">c. 3<br>
    <input type="radio" name="q1" value="d">d. 4<br>

    <form name="form" onsubmit="return score()">
    <h3>1. How many yellow cards equal a red card in football?</h3>
    <input type="radio" name="q2" value="a">a. 1<br>
    <input type="radio" name="q2" value="b">b. 2<br>
    <input type="radio" name="q2" value="c">c. 3<br>
    <input type="radio" name="q2" value="d">d. 4<br>

    <form name="form" onsubmit="return score()">
    <h3>1. How many yellow cards equal a red card in football?</h3>
    <input type="radio" name="q3" value="a">a. 1<br>
    <input type="radio" name="q3" value="b">b. 2<br>
    <input type="radio" name="q3" value="c">c. 3<br>
    <input type="radio" name="q3" value="d">d. 4<br>
    <br>
    <input type="submit" id="sendA" value="Submit">
    <br>
    <p id="p"></p>

</form>

</html>

<script> 

function score()
{
    //Referencing the value of the questions
    var q1 = document.forms.form.q1.value;
    var q2 = document.forms.form.q2.value;
    var q3 = document.forms.form.q3.value;

    //Array for the questions
    var questions = [q1, q2, q3];

    //Answers for each question
    var answers = ["b", "b", "b"];

    //variable to keep track of the points
    var points = 0;
    var total = 3;
    //max score 

    //Making use of a for loop to iterate over the questions and answers arrays
    for (var i = 0; i < total; i  )
    {
    if (questions[i] == answers[i]) {
            points = points   1; //Increment the score by 2 for every correct answer given
        }
    }

    //CSS for questions
    var q = document.getElementById("p");

    q.style.fontSize = "40px";
    q.style.textAlign = "center";
    q.innerHTML = "You got "   points   " out of "   total;

    return false;
}

    </script>
  

Комментарии:

1. Я не просматривал весь код, но 1) setTimeout("CheckTime()",1000) должно быть setTimeout(CheckTime,1000) 2) Нет элемента с quiz-time-left идентификатором. 3) form в тегах отсутствуют закрывающие теги

2. Я бы подумал, что вы хотели бы, чтобы все вопросы были в одной форме.

Ответ №1:

Ваш html был разделен на несколько форм, вам нужна только одна. В вашем примере вам не хватило div оставшегося времени для викторины, поэтому я добавил его в начало. В качестве небольшого дополнительного штриха я отключил ввод, когда таймер истек.

 var total_seconds = 30 * 1;
var c_minutes = parseInt(total_seconds / 60);
var c_seconds = parseInt(total_seconds % 60);
var timer;

function CheckTime() {
  document.getElementById("quiz-time-left").innerHTML = 'Time Left: '   c_minutes   ' minutes '   c_seconds   ' seconds ';

  if (total_seconds <= 0) {
    score();
  } else {
    total_seconds = total_seconds - 1;
    c_minutes = parseInt(total_seconds / 60);
    c_seconds = parseInt(total_seconds % 60);
    timer = setTimeout(CheckTime, 1000);
  }
}
timer = setTimeout(CheckTime, 1000);

function score() {
  // stop timer
  clearInterval(timer);

  //Referencing the value of the questions
  var q1 = document.forms.form.q1.value;
  var q2 = document.forms.form.q2.value;
  var q3 = document.forms.form.q3.value;

  // disable form
  var elements = document.getElementById("questions").elements;
  for (var i = 0, len = elements.length; i < len;   i) {
    elements[i].disabled = true;
  }

  //Array for the questions
  var questions = [q1, q2, q3];

  //Answers for each question
  var answers = ["b", "b", "b"];

  //variable to keep track of the points
  var points = 0;
  var total = 3;
  //max score 

  //Making use of a for loop to iterate over the questions and answers arrays
  for (var i = 0; i < total; i  ) {
    if (questions[i] == answers[i]) {
      points = points   1; //Increment the score by 2 for every correct answer given
    }
  }

  //CSS for questions
  var q = document.getElementById("p");

  q.style.fontSize = "40px";
  q.style.textAlign = "center";
  q.innerHTML = "You got "   points   " out of "   total  
    "<br />"  
    "you used "   (29 - Math.floor(total_seconds))   " seconds";

  return false;
}  
 <div id="quiz-time-left">

</div>
<form name="form" id="questions" onsubmit="return score()">
  <h3>1. How many yellow cards equal a red card in football?</h3>
  <input type="radio" name="q1" value="a">a. 1<br>
  <input type="radio" name="q1" value="b">b. 2<br>
  <input type="radio" name="q1" value="c">c. 3<br>
  <input type="radio" name="q1" value="d">d. 4<br>

  <h3>1. How many yellow cards equal a red card in football?</h3>
  <input type="radio" name="q2" value="a">a. 1<br>
  <input type="radio" name="q2" value="b">b. 2<br>
  <input type="radio" name="q2" value="c">c. 3<br>
  <input type="radio" name="q2" value="d">d. 4<br>

  <h3>1. How many yellow cards equal a red card in football?</h3>
  <input type="radio" name="q3" value="a">a. 1<br>
  <input type="radio" name="q3" value="b">b. 2<br>
  <input type="radio" name="q3" value="c">c. 3<br>
  <input type="radio" name="q3" value="d">d. 4<br>
  <br>
  <input type="submit" id="sendA" value="Submit">
  <br>
  <p id="p"></p>

</form>  

Комментарии:

1. Конечно, я остановил таймер, когда вы нажмете «Отправить», тогда у вас есть время, оставшееся в total_seconds

2. Это приведет вас на другую страницу? На какую страницу вы отправлены? Приводит ли фрагмент кода в моем ответе вас на другую страницу?

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

4. Зачем использовать setTimeout. В этом сценарии, я думаю, setInterval подошел бы лучше.

5. попробуйте взглянуть на мой код, я обновил его, как вы прокомментировали здесь, он должен это сделать. 🙂 @Abhishek Я пытался не полностью изменять исходный код, есть много других областей, в которых вы могли бы оптимизировать код. Но чтобы сделать ответ более понятным, я постарался воздержаться от изменения слишком большого количества кода по сравнению с оригиналом. Но вы абсолютно правы, я лично использовал бы setInterval вместо этого. 🙂