Простая викторина - как получить значения по клику и отправить их в php

0

Мне нужно написать простое приложение для викторины. Когда я выбрал его за кого-то, это то, что у меня есть. Есть 10 вопросов с 3 ответами каждый. Все вопросы загружаются сразу, и только один видимый. После нажатия на ответ появляется следующий вопрос и т.д. Однако, поскольку javascript для меня маловат, я не знаю, как получить все ответы и отправить его на php, чтобы проверить, правильно ли пользователь выбрал правильный. Код выглядит примерно так:

<form action="result.php">

<div class="quiz>
    <div class="question"> Some question ?
        <ul>
            <li><a href="#">Answer A</a></li>
            <li><a href="#">Answer B</a></li>
            <li><a href="#">Answer C</a></li>
        </ul>
   </div>

[… more question here …]

<div class="question">Last question ?
        <ul>
            <li><a href="#" onClick="[some submit magic]">Answer A</a></li>
            <li><a href="#" onClick="[some submit magic]">Answer B</a></li>
            <li><a href="#" onClick="[some submit magic]">Answer C</a></li>
        </ul>
</div>

</div>
<input type="hidden" name="answers" value="answers[]>
</form>

Поэтому в основном пользователь нажимает на ответ, появляется следующий вопрос, и в конце мне нужно заполнить все ответы и отправить его в result.php, где каким-то образом я получаю результаты в массиве с выбранными ответами типа {1,3,2,1,2, 3,1,2,3,1} или что-то в этом роде.

  • 0
    Определите глобальный массив и отправьте ответы в этом массиве и при последней отправке на сервер через ajax learn.jquery.com/javascript-101/arrays.
  • 1
    Почему бы вам не использовать <input type="radio"> поле ввода, которое предназначено именно для него?
Показать ещё 3 комментария
Теги:

3 ответа

1
Лучший ответ

Есть много способов сделать это. Здесь легкий:

  • добавить

    <input type="hidden" name="questions[]" value="" />
    

    внутри каждого .question DIV

  • обновите значение этого ввода при нажатии одной из ссылок:

    $('.question a').on('click', function(){
      var answer = $(this).text();
      $(this).parents('.question').find('input').val(answer);
    });
    
  • поместите метод запроса в вашу форму, скажем, POST

Затем в вашем PHP-скрипте вы получите числовой индексный массив с выбранным ответом для каждого вопроса, $_POST['questions'].

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

  • 0
    Мне нравится, как вы предлагаете обойти любой JavaScript. Поцелуй :)
  • 0
    Я выбрал код в этом состоянии после кого-то, но я думаю, что вы правы, так как, глядя на дизайн, было бы довольно сложно выполнить то, что хотел дизайнер с традиционным полем ввода.
0

Еще одно решение проблемы: jsFiddle

Мы используем обработчики событий, чтобы проверить, был ли нажат ответ, а затем добавьте индекс ответа в массив. Когда последний ответ был отправлен, мы отправляем данные на страницу php, где вы можете обрабатывать ее с помощью массива $_POST.

$('.question a').on('click', function (e) {
    e.preventDefault();
    var self = $(this);
    var ans = self.parent().index() + 1;
    answers.push(ans);
    var hasNext = nextQuestion();
    if (!hasNext) {
        $.ajax({
            type: "POST",
            url: "/echo/json/",
            data: {
                "answers": answers
            }
        }).done(function (response) {
            response = 'Stuff you output with PHP';
            $('body').append('<p> Result: ' + response + '</p>');
        });
    }
});
0

Как правило, вы должны создать HTTP-запрос для вашего контрольного сервера. jQuery, для одного, делает это довольно легко. Кроме того, я бы попытался сгенерировать вопросы HTML, чтобы вы были готовы создавать викторины с другими наборами вопросов без повторного ввода html.

В настоящее время я пытаюсь создать приложение для викторины, и я был бы рад услышать ваши отзывы. Краткий отрезанный от того, что я имею в виду, находится на этой скрипке: http://jsfiddle.net/xtofl/2SMPd/

В основном что-то вроде:

function verify(answers) {
  jQuery.ajax("http://yoursite/verify.php?answers="+answers,
     { async: true,
       complete: function(response, status){
          // e.g.
          alert(response.text);
       }
     };
  };

Этот запрос будет отправлен, когда все ответы будут завершены. Я бы попытался создать вопросы "на лету" с помощью javascript и DOM, что-то вроде:

function retrieveQuestions() {
  //TODO: get them from a json-request like http://yourquizz/quizz1/questions
  return [{ text: "what if Zoo went to Blohom in a Flurk?",
           options: { a: "he frunts and vloghses", 
                      b: "the Blohom doesn't snorf anymore" }
          },
          { text: "how many this and that",
            options: { a: "1", b: "2", c: "14" }
          }
  ];
};

// retrieve and create the questions elements
var questions = retrieveQuestions();
questions.forEach(function(question, index){
  jQuery("#questions").append(createQuestionElement(question));
});

// what does a question element look like:
function createQuestionElement(question){
   var li=document.createElement("li");
   var options = [];
   Object.keys(question.options).forEach(function(key){
      var o = document.createElement("div");
      jQuery(o).on('click', function(){question.answer=jQuery(o).val();});
      li.appendChild(o);
   });
   return li;
}

Ваш скрипт php backend verify.php проверяет аргументы и возвращает результат в формате json, например:

$correct = ($answers[ $_GET["question"] ] == $_GET["answer"]);
print("{ 'correct': '$correct' }");

(если ваши ответы хранятся в массиве $answers.

  • 0
    Спасибо за ваше предложение, но я остановлюсь на «простом», приведенном выше :), так как в последний раз, когда я кодировал что-то, было 7 лет назад, когда все было просто, и люди платили за это много денег;)
  • 0
    @Kaziko: пожалуйста. Определенно идите к простому, когда родовое и модное не нужны!

Ещё вопросы

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