Правильная проверка чекбоксов
Вот у меня есть какой-то список вопросов, с правильными вариантами ответов (correct)
[
{
"question": "123",
"answers": [
"1231",
"1231",
"123",
"124"
],
"correct": [2]
},
{
"question": "124214",
"answers": [
"12312",
"12321",
"123213"
],
"correct": [1]
},
{
"question": "2152",
"answers": [
"12512",
"125215",
"121421",
"124124"
],
"correct": [1, 2, 4]
},
{
"question": "12412521",
"answers": [
"15125125",
"125125",
"125125"
],
"correct": [1, 2, 3]
}
]
Я беру этот .json файл из сервера. Проверяю айди чекбокса по номеру из correct
let inp;
let answered = document.getElementById("answered");
let allque = document.getElementById("allque");
answered.value = 0;
////взятие файла с сервера
function checkright() {
fetch("http://localhost:3000/public/data.json")
.then((response) => {
return response.json();
})
////сама проверка чекбоксов
.then((data) => {
for (let i = 0; i < data.length; i++) {
for (let j = 0; j < data[i].question.length; j++) {
inp = document.getElementById(i + "_" + j);
if (inp && inp.checked) {
if (j + 1 == data[i].correct[j]) {
answered.value++;
} else {
answered.value = 0;
}
}
}
}
console.log(answered.value);
});
}
В итоге, у меня на некоторых ответах, которые начинаются не с 1, неправильно проверяет и выводит результат = 0. Как сделать правильную проверку, и там, где более 2х вариантов правильных, засчитывало один балл? |
тут немного другие вопросы, так как сгенерировались рандомно
<body>
<div>
<h3>124214</h3>
<input type="checkbox" id="0_0">12412<br>
<input type="checkbox" id="0_1">12412<br>
<input type="checkbox" id="0_2">1214<br>
<input type="checkbox" id="0_3">12421<br>
<hr>
</div>
<div>
<h3>124214</h3>
<input type="checkbox" id="1_0">12412<br>
<input type="checkbox" id="1_1">124214<br>
<input type="checkbox" id="1_2">124214<br>
<hr>
</div>
<div>
<h3>12421421</h3>
<input type="checkbox" id="2_0">12421421<br>
<input type="checkbox" id="2_1">1242141<br>
<input type="checkbox" id="2_2">1242141<br>
<input type="checkbox" id="2_3">112312<br>
<hr>
</div>
<div>
<h3>124124</h3>
<input type="checkbox" id="3_0">124124124<br>
<input type="checkbox" id="3_1">12412421<br>
<input type="checkbox" id="3_2">1124214<br>
<input type="checkbox" id="3_3">12412421<br>
<hr>
</div>
<button onclick=" checkright()">Ответить</button>
<p>Отвечено: <output id="answered">0</output> /
<output id="allque">из </output>
</p>
<script type="text/javascript" src="js/app.js"></script>
</body>
|
maplol123@gmail.com,
let inp;
let answered = document.getElementById("answered");
let allque = document.getElementById("allque");
answered.value = 0;
////взятие файла с сервера
function checkright() {
fetch("http://localhost:3000/public/data.json")
.then((response) => {
return response.json();
})
////сама проверка чекбоксов
.then((data) => {
inp = Array.from(document.querySelectorAll("div"),
div => Array.from(div.querySelectorAll('[type="checkbox"]'),
({checked}, i) => checked ? ++i : 0)
.filter(a => a));
answered.value = data.filter(({correct}, i) => JSON.stringify(correct) === JSON.stringify(inp[i])).length
allque.value = `из ${data.length}`;
console.log(answered.value);
});
}
|
рони, спасибо огромное!
|
рони,
и, извините за наглость, можете ли написать, чтоб как-то div с неправильным ответом выделялся, например, backgroundColor: red? |
maplol123@gmail.com,
let inp;
let answered = document.getElementById("answered");
let allque = document.getElementById("allque");
answered.value = 0;
////взятие файла с сервера
function checkright() {
fetch("http://localhost:3000/public/data.json")
.then((response) => {
return response.json();
})
////сама проверка чекбоксов
.then((data) => {
const divs = document.querySelectorAll("div");
inp = Array.from(divs,
div => Array.from(div.querySelectorAll('[type="checkbox"]'),
({checked}, i) => checked ? ++i : 0)
.filter(a => a));
answered.value = data.filter(({correct}, i) => JSON.stringify(correct) === JSON.stringify(inp[i]) || divs[i].classList.add('red')).length
allque.value = `из ${data.length}`;
console.log(answered.value);
});
}
|
рони,
Большое спасибо!:) |
| Часовой пояс GMT +3, время: 11:56. |