Мне нужно написать простое приложение для викторины. Когда я выбрал его за кого-то, это то, что у меня есть. Есть 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} или что-то в этом роде.
Есть много способов сделать это. Здесь легкий:
добавить
<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, используя скрытые радиовходы и метки (я предполагаю, что вы используете ссылки из-за ограничений стиля в полях ввода).
Еще одно решение проблемы: 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>');
});
}
});
Как правило, вы должны создать 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
.
<input type="radio">
поле ввода, которое предназначено именно для него?