Как последовательно считывать данные json файла и отдавать в форму?
Есть интерфес опросника, который работает без перезагрузки страницы и данные которые берутся из json файла.
Вариант с одним вопросом реализован, сложности начинаются, когда вопросов много в цепочке один за другим. Как сделать так, чтобы считывать данные из json файла в массив и последовательно отдавать после нажатия на кнопку ответить очередного вопроса? Собираю массив через Код:
data.forEach(function(item) {});Как можно реализовать задуманное? Фидл здесь - http://jsfiddle.net/qxrognd6/
$(function() {
var vote = {};
$('#ok').click(function() {
$.get(poll.json, function(data) {
// фактически данные poll.json хранятся в таком виде
//data = [{"id":"1", "question":"Какую марку предпочитаете?", "answers":["honda", "bmw", "volvo"]}, {"id":"2", "question":"Цвет авто?", "answers":["black", "red", "blue"]}
data.forEach(function(item) {
vote.id = item.id;
vote.question = item.question;
vote.answers = item.answers;
});
answers();
});
appearance('#start', '#content');
return false;
});
var appearance = function(slide, content) {
$(slide).hide('fast', showNewContent);
$('#load').remove();
$('#wrapper').append('<span id="load">LOADING...</span>');
$('#load').fadeIn('normal');
function showNewContent() {
$(content).show('normal', hideLoader());
}
function hideLoader() {
$('#load').fadeOut('normal');
}
};
var answers = function() {
for (var i = 0; i <= vote['answers'].length - 1; i++) {
var form = $('#vote');
var answers = form.find('.answers');
form.parent().find('.question').text(vote['question']);
answers.append('<div class="radio">' +
'<label>' +
'<input type="radio" name="poll" value="' + (i + 1) + '">' +
vote['answers'][i] +
'</label>' +
'</div>');
}
};
});
<div id="start"> <a id='ok' href=''>Поехали</a> </div> <div id="content"> <h4 class="question">Вопрос</h4> <form id="vote" action="vote.php" method="POST"> <div class="answers"></div> <button type="submit" class="btn btn-default">ответить</button> </form> </div> Код:
#content { |
А вывести все вопросы на страницу в одной форме и последовательно их показывать - не вариант?
|
Цитата:
вариант. А как это сделать? в смысле последовательно показывая и скрывая предыдущий вопрос? Прошу прощения, не дописал 3 строчки кода в функцию answers. Исправился. Я правильно вас понял, что вы предлагаете каким-то образом выводить и последовательно скрывать вот этот перечень вопросов?
<form id="vote" action="#" method="POST">
<div id="content">
<h4 class="question">Какую марку предпочитаете?</h4>
<div class="answers">
<div class="radio"><label><input type="radio" name="poll" value="1">honda</label></div>
<div class="radio"><label><input type="radio" name="poll" value="2">bmw</label></div>
<div class="radio"><label><input type="radio" name="poll" value="3">volvo</label></div>
<button type="submit" class="btn btn-default">Ответить</button>
</div>
<h4 class="question">Цвет авто?</h4>
<div class="answers">
<div class="radio"><label><input type="radio" name="poll" value="1">black</label></div>
<div class="radio"><label><input type="radio" name="poll" value="2">red</label></div>
<div class="radio"><label><input type="radio" name="poll" value="3">blue</label></div>
<button type="submit" class="btn btn-default">Ответить</button>
</div>
</div>
</form>
|
giwuf,
в строке 2 добавить индекс = 0, по клику увеличивать и показывать вопрос согласно индексу |
giwuf, если данные в json и их количество в наборе равно (по три кнопки), то нужно не строить постоянно html код, а заполнять значениями данных одних и тех же кнопок, двигаясь по массиву json.
|
Цитата:
$(function() {
var index = 0;
var vote = {};
$('#ok').click(function() {
index++;
$.get(poll.json, function(data) {
data.forEach(function(item) {
vote.id = item.id;
vote.question = item.question;
vote.answers = item.answers;
});
answers();
});
appearance('#start', '#content');
return false;
});
});
Цитата:
|
Цитата:
|
giwuf,
получили json, вывели все блоки на страницу, показали только блок с индексом 0. по клику на btn скрыли блок с текущим индексом, увеличили индекс, открыли следующий блок |
|
|
Цитата:
$(function(){
var vote = {};
var index = 0;
var item;
$('#ok').click(function(){
$.get(pathToPolls, function(data) {
item = JSON.parse(data);
answers(); //выводим блоки с вопросами
});
if(index) {
vote['id']= item[index]['id'];
vote['question']=item[index]['question'];
vote['answers']=item[index]['answers'];
show_answers(); //показываем блок с вопросами
}
else {
vote['id']= item[index]['id'];
vote['question']=item[index]['question'];
vote['answers']=item[index]['answers'];
show_answers();
index++;
}
});
});
|
giwuf,
зачем вам vote ? |
рони и Nexus, спасибо большое за помощь - изучу и постараюсь внедрить!
|
giwuf,
item = JSON.parse(data); ??? это jquery, data уже обьект , а не строка. item = data; |
Цитата:
А в случае с примером от Nexus Цитата:
const data = [{
"id": "1",
"question": "Какую марку предпочитаете?",
"answers": ["honda", "bmw", "volvo"]
}, {
"id": "2",
"question": "Цвет авто?",
"answers": ["black", "red", "blue"]
}];
И теперь вытащить данные с настоящего файла json, как было раньше не удается. Так:
$.get(data.json, function(data) { });
Или так
$.getJSON(data.json, function( data ) {
var items = [];
$.each( data, function( key, val ) {
items.push( "<li id='" + key + "'>" + val + "</li>" );
});
});
Показывает ошибку и данные не подтягиваются. Снова что-то недопонимаю? Иои нужно константу сохранять как файл json и подключать так и потом парсить? <script type="text/javascript" src="file.json"></script> |
Цитата:
Цитата:
|
giwuf,
<form id="vote" action="#" method="POST">
<div id="content">
<div class="pattern">
<h4 class="question">{% question %}</h4>
<div class="answers">
<div class="radio"><label><input type="radio" name="poll[{% id %}]" value="{% answer.value %}">{% answer.title %}</label></div>
</div>
</div>
</div>
<div><button type="submit" class="btn btn-default">Ответить</button></div>
</form>
<script>
$.getJSON('/path/to/you-json',function(data){
data=(typeof data==='string')?JSON.parse(data):data;
const content = document.getElementById('content');
const patternNode = content.querySelector('.pattern');
patternNode.classList.remove('pattern');
const pattern = patternNode.outerHTML;
patternNode.parentNode.removeChild(patternNode);
data.forEach(function(question, index) {
content.insertAdjacentHTML('beforeEnd', pattern.replace(/{%\s?question\s?%}/gim, question.question));
const questionNode = content.lastChild;
questionNode.dataset.index = index;
questionNode.style.display = 'none';
const answers = questionNode.querySelector('.answers');
const answer = answers.querySelector('.radio').outerHTML;
answers.innerHTML = question.answers.map(function(title, value) {
return answer
.replace(/{%\s?id\s?%}/gim, question.id)
.replace(/{%\s?answer.title\s?%}/gim, title)
.replace(/{%\s?answer.value\s?%}/gim, value);
}).join("\n");
});
let currentQuestionIndex = 0;
const questions = [].slice.call(content.querySelectorAll('[data-index]'));
questions[0].style.display = 'block';
document.querySelector('#vote [type="submit"]').addEventListener('click', function(e) {
questions[currentQuestionIndex].style.display = 'none';
if (++currentQuestionIndex >= questions.length)
return;
e.preventDefault();
questions[currentQuestionIndex].style.display = 'block';
});
});
</script>
|
:-? одно name на все блоки?
|
О, Nexus и рони, спасибо большое! Готов расцеловать!
Расставлю плюсы как только откроется у меня такая возможность. 2 последних мини-вопроса: 1 - выбранные ответы на вопросы на каждой итерации передается в файл, который укажу в форме в поле action="" или как-то по другому 2 - чтобы добавить нумерацию вопросов по id из файла - мне нужно
data.forEach(function(question, index) {
//приплюсовать к заголовку вопроса параметр index - так?
});
|
Цитата:
|
Цитата:
giwuf, 1. выбранные ответы передаются на сервер после того, как пользователь ответит на все вопросы; 2. да, можно и так. upd. п.1 обновил. |
Цитата:
Цитата:
|
Nexus и рони, понял, отлично, спасибо!
|
| Часовой пояс GMT +3, время: 07:17. |