Тест JavaScript с несколькими вопросами

Ниже я сделал небольшую викторину с 4 вопросами и вопросы 2,3 и 4 скрыты с помощью CSS, но вы можете попробовать удалить стиль из CSS (".pytja2, .pytja3, .pytja4 { display: none;}") чтобы увидеть все вопросы или поставить стиль display: hidden к каждому вопросу по одному и вы их увидите.

Я сделал это, потому что я хотел бы показать следующий вопрос, когда я нажимаю кнопку Следующий, тогда следующий вопрос будет отображаться после того, как я каждый раз нажимаю кнопку Следующий. Но у меня есть проблема с вопросом 2, который не отображается, и он не показывает никаких ошибок в журнале консоли, и я добавил в JavaScript функцию, которая, когда я нажимаю кнопку «Далее», первый вопрос будет скрыт, и он покажет следующий вопрос, но я не знаю, что не так.

<div class = "quiz">
        <div id = "pytja1">
         <span class = "quest1">I am a ?</span> 
        <form class = "questions1" action = "">
          <input class = "correct" type = "radio" name = "gender" value = "male"> Male<br>
          <input type = "radio" name = "gender" value = "female"> Female<br>
          <input type = "radio" name = "gender" value = "other"> Other<br>  
          <input id = "bot" type = "button" value = "Next">
        </form>
      </div>
      <div id = "pytja2">
        <span class = "quest2">Football has letters ?</span> 
        <form class = "questions2" action = "">
          <input class = "correct" type = "radio" name = "gender" value = "male"> 7<br>
          <input type = "radio" name = "gender" value = "female"> 5<br>
          <input type = "radio" name = "gender" value = "other"> 6<br>  
          <input id = "bot" type = "button" value = "Next">
        </form>
      </div>
      <div id = "pytja3">
        <span class = "quest3">VV stands for ?</span> 
        <form class = "questions3" action = "">
          <input type = "radio" name = "gender" value = "male"> BMW <br>
          <input class = "correct" type = "radio" name = "gender" value = "female"> Volksvagen<br>
          <input type = "radio" name = "gender" value = "other"> Audi<br>  
          <input id = "bot" type = "button" value = "Next">
        </form>
      </div>
      <div id = "pytja4">
        <span class = "quest4">What year it is ?</span> 
        <form class = "questions4" action = "">
          <input type = "radio" name = "gender" value = "male"> 2017<br>
          <input type = "radio" name = "gender" value = "female"> 2015<br>
          <input class = "correct" type = "radio" name = "gender" value = "other"> 2019<br>  
          <input id = "bot-submit" type = "submit" value = "Submit">
        </form>
      </div>
      </div>
.quiz{
  margin-top: 50px;
  margin-left: 40%;
  width: 250px;
  height: 100px;
  background-color: coral;
}
.quest1{
  background-color: cadetblue;
  padding-right: 50px;
  margin-left: 30px;
  font-size: 22px;
}
.quest2{
  background-color: cadetblue;
  padding-right: 50px;
  margin-left: 30px;
  font-size: 22px;
  position: absolute;
  top: 3884px;
}
.quest3{
  background-color: cadetblue;
  padding-right: 50px;
  margin-left: 30px;
  font-size: 22px;
  position: absolute;
  top: 3884px;
}
.quest4{
  background-color: cadetblue;
  padding-right: 50px;
  margin-left: 30px;
  font-size: 22px;
  position: absolute;
  top: 3884px;
}
.questions1{
  margin-left: 28px;
  background-color: cyan;
  width: 220px;
  padding: 10px;
  font-size: 20px;
}
.questions2{
  margin-left: 28px;
  background-color: red;
  width: 150px;
  padding: 10px;
  font-size: 20px;
  position: absolute;
  top: 3925px;
}
.questions3{
  margin-left: 28px;
  background-color: greenyellow;
  width: 150px;
  padding: 10px;
  font-size: 20px;
  position: absolute;
  top: 3925px;
}
.questions4{
  margin-left: 28px;
  background-color: olivedrab;
  width: 150px;
  padding: 10px;
  font-size: 20px;
  position: absolute;
  top: 3925px;
}
.bot{
  margin-top: 10px;
}
.pytja2,.pytja3,.pytja4{
  display: none;
}
/* End of Quiz*/
let question2 = document.getElementById('pytja2');
let question3 = document.getElementById('pytja3');
let question4 = document.getElementById('pytja4');
let nextQuestion = document.getElementById('bot');
let result = document.getElementById('bot-submit');


nextQuestion.onclick = function () {
    if (nextQuestion === question1) {
        question1.style.display = 'none'
    } else if (nextQuestion === question2) {
        question2.style.display = 'block'
   }
}

Нет элемента с идентификатором bot. есть элементы с class = "bot"

Alex Kudryashev 18.04.2019 22:12

@AlexKudryashev на самом деле это первый вопрос. Его код какой-то беспорядочный и непоследовательный.

Kevin Vandy 18.04.2019 22:15

Просто из любопытства, но задумывались ли вы об использовании запросов XHR/Ajax для получения следующего вопроса с сервера, когда пользователь нажимает кнопку «Далее», чтобы перейти к следующему вопросу? Затем вы можете заполнить каждый соответствующий div вопросом/ответом, и это не позволит пользователям просматривать ваш исходный код и изменять видимость. Я знаю, что это выходит за рамки того, о чем вы спрашиваете, но может быть пищей для размышлений...

Woodrow 18.04.2019 22:20

@AlexKudryashev Изменил класс на ID, проверьте :)

Behar 18.04.2019 22:57

@Woodrow Я думал сделать простой проект без Ajax или PHP, потому что я еще не изучил Ajax

Behar 18.04.2019 22:57

Вы можете просто сохранить будущие вопросы в объекте JS и просто генерировать их при нажатии кнопки «Далее». Кроме того, используйте общий класс для похожих элементов, чтобы не повторять свой код — простой тест .quest и .question сократит части вашего кода на 75%.

Andu Andrici 18.04.2019 22:59
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
107
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, похоже, возникла некоторая путаница при использовании bot в качестве селектора ID и селектора CLASS в вашем коде. Я взял на себя смелость почистить это и сделать так, чтобы кнопки «Далее» использовали .bot как class. Если вы собираетесь повторно использовать значение имени в элементе, используйте синтаксис class. ID должен относиться к одному элементу в DOM.

Кроме того, если вы создаете форму для отправки всех ответов, было бы лучше объявить <form> один раз, а затем сделать так, чтобы каждый набор переключателей содержал одно и то же имя для каждого набора вопросов, например (пол, автомобиль и т. д.), поэтому, когда вы обрабатываете форму, будет легко получить выбранные пользователем варианты для каждого набора вопросов.

Я также подчистил часть CSS, чтобы помочь, и добавил цикл for, который привязывает функцию onclick к каждому Next button в форме, поэтому при каждом щелчке он будет проверять parentNode.Id, чтобы увидеть, какие div элементы он должен скрыть и сделать виден для каждого следующего блока вопросов. Этот цикл for достигается путем ссылки на класс .bot с помощью document.querySelectorAll('.bot');

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

let question1 = document.getElementById('pytja1');
let question2 = document.getElementById('pytja2');
let question3 = document.getElementById('pytja3');
let question4 = document.getElementById('pytja4');
let result = document.getElementById('bot-submit');
let nextButtons = document.querySelectorAll('.bot');

for (let i = 0; i < nextButtons.length; i++) {
  let nextQuestion = nextButtons[i];
  nextQuestion.onclick = function() {
    switchToNextQuestion(this);
  }
}

function switchToNextQuestion(nextQuestion) {
  let parentId = nextQuestion.parentNode.id;
  if (parentId === 'pytja1') {
    question1.style.display = 'none';
    question2.style.display = 'block';
  } else if (parentId === 'pytja2') {
    question2.style.display = 'none';
    question3.style.display = 'block';
  } else if (parentId === 'pytja3') {
    question3.style.display = 'none';
    question4.style.display = 'block';
  }
}

result.onclick = function() {
  alert('I am submitting the quiz!');
}
form {
  width: 100%;
  position: relative;
  float: left;
  padding-top: 50px;
}

.quiz {
  margin: 0px auto;
  width: 250px;
  height: 100px;
}

.quest1,
.quest2,
.quest3,
.quest4 {
  background-color: cadetblue;
  font-size: 22px;
}

.questions1 {
  margin-left: 28px;
  background-color: cyan;
  width: 220px;
  padding: 10px;
  font-size: 20px;
}

.questions2 {
  background-color: red;
}

.questions3 {
  background-color: greenyellow;
}

.questions4 {
  background-color: olivedrab;
}

.bot {
  margin-top: 10px;
}

#pytja2,
#pytja3,
#pytja4 {
  margin-left: 28px;
  display: none;
  width: 220px;
  padding: 10px;
  font-size: 20px;
}


/* End of Quiz*/
<form id = "quiz-form">
  <div class = "quiz">
    <div id = "pytja1" class = "questions1">
      <span class = "quest1">I am a ?</span><br/>
      <input type = "radio" name = "gender" value = "male" class = "correct"> Male<br/>
      <input type = "radio" name = "gender" value = "female"> Female<br/>
      <input type = "radio" name = "gender" value = "other"> Other<br/>
      <input class = "bot" type = "button" value = "Next" />
    </div>
    <div id = "pytja2" class = "questions2">
      <span class = "quest2">Football has # letters ?</span><br/>
      <input type = "radio" name = "football" value = "8" class = "correct"> 8<br/>
      <input type = "radio" name = "football" value = "5"> 5<br/>
      <input type = "radio" name = "football" value = "6"> 6<br/>
      <input class = "bot" type = "button" value = "Next" />
    </div>
    <div id = "pytja3" class = "questions3">
      <span class = "quest3">VW stands for ?</span><br/>
      <input type = "radio" name = "car" value = "BMW" /> BMW <br/>
      <input type = "radio" name = "car" value = "Volkswagen" class = "correct" /> Volkswagen<br/>
      <input type = "radio" name = "car" value = "Audi" /> Audi<br/>
      <input class = "bot" type = "button" value = "Next" />
    </div>
    <div id = "pytja4" class = "questions4">
      <span class = "quest4">What year it is ?</span><br/>
      <input type = "radio" name = "year" value = "2017" /> 2017<br/>
      <input type = "radio" name = "year" value = "2015" /> 2015<br/>
      <input type = "radio" name = "year" value = "2019" class = "correct" /> 2019<br/>
      <input id = "bot-submit" type = "submit" value = "Submit" />
    </div>
  </div>
</form>

Большое спасибо за вашу помощь и даже рабочий тест, как я планировал, спасибо :) Просто вопрос, почему вы использовали "if (parentId === 'pytja1')", почему вы не использовали кнопку Далее вот так «if (nextButtons === 'pytja1')», спрашивая об этом, потому что мне нужно было сначала нажать кнопку «Далее» и сравнить с «pytja1», «pytja2» и т. д.

Behar 18.04.2019 23:48

Пожалуйста. Причина, по которой я сделал parentId === 'pytja1', заключается в том, что когда вы нажимаете одну из кнопок «Далее», событие onclick затем проверяет, какой родительский узел (<div id = "pytja1">) является кнопкой «Далее». дочерний элемент, чтобы определить, где находится пользователь в шагах викторины. Это позволяет функции определять, как скрыть/показать каждый вопрос по мере продвижения в викторине.

Woodrow 18.04.2019 23:54

Просто чтобы уточнить, если вы хотите добавить определенные идентификаторы для каждой следующей кнопки, поэтому <input type = "button" id = "next-button-1" class = "bot" value = "Next"/> вы можете ссылаться на значение идентификатора кнопки внутри функции onclick и сравнение с использованием этого значения идентификатора === "next-button-1" вместо просмотра родительского узла, чтобы определить, что нужно скрыть/показать. Несколько разных способов снять шкуру с этого пресловутого кота.

Woodrow 19.04.2019 00:15

Спасибо, что объяснили :)

Behar 19.04.2019 00:23

Другие вопросы по теме