Цитата:
Пусть элементы ответа на вопрос содержаться в элементе fieldset, который и содержит в атрибуте data-check значение равное сумме всех полей с верным ответом. Если поля, это радио кнопки, значит это будет 1, если флажки, то от 1 до ... Поля с верным выбором, это value=1, с неверным, это value=0. Проверить, это обход коллекции fieldset (или только у текущей fieldset, если проверка инициализируется для конкретного вопроса), у которого берутся ее поля, и суммируются их значения, с последующей проверкой значения data-check fieldset. Ответом может может быть - неверно или N правильных ответов (сумма полей) из M (значение data-check). То есть, это одна и та же операция для всех вопросов не зависимо от типа полей. Получить сумму полей, это обойти их циклом или в современных браузерах с поддержкой "вся", это [...fields].reduce(). Ведь это намного проще, чем то, чем вы маетесь, причем, лично для меня, не понятно с какой целью. Ведь если по уму и проверять сервером знания, то достаточно изменить значения полей на 1....N и все, а все ваше придется перелопачивать, удаляя/добавляя. |
Alena_03,
type="text" не забывайте указывать и смотрите код, функция checkOneAnswer изменена. <!DOCTYPE html> <html lang="ru"> <head> <title>Тест по JS</title> <meta charset="utf-8"> <style> #check { display: none; } #test { display: none; } </style> </head> <body background="logo1.png"> <div id="icapt"> <p id="text"></p> <input type="text" id="captchaEdit" value="" /> <input type="submit" value="Отправить" onClick="checkCaptcha();" /> </div> <ul id="test"> <li class="question"> Что из перечисленного не является операцией сравнения? <ul> <li><label><input type="checkbox" data-true>a = b</label></li> <li><label><input type="checkbox">a != b</label></li> <li><label><input type="checkbox" data-true>a ==== b</label></li> </ul> </li> <li class="question"> <p>вопрос 1?</p> <ul> <li><label><input data-true="ответ 1" type="text"></label></li> </ul> </li> <li class="question"> <p>вопрос 2?</p> <ul> <li><label><input data-true="ответ 2" type="text"></label></li> </ul> </li> <li class="question"> Как выглядит однострочный комментарий в JS? <ul> <li><label><input type="radio" name="question1" data-true>//</label></li> <li><label><input type="radio" name="question1">/**/</label></li> <li><label><input type="radio" name="question1">< !-- --></label></li> </ul> </li> <li class="question"> Что получится, если сложить true + false? <ul> <li><label><input type="radio" name="question2">NaN</label></li> <li><label><input type="radio" name="question2">0</label></li> <li><label><input type="radio" name="question2" data-true>1</label></li> </ul> </li> <li class="question"> Выберите то, что является типом данных в JS <ul> <li><label><input type="checkbox" data-true>object</label></li> <li><label><input type="checkbox">num</label></li> <li><label><input type="checkbox" data-true>null</label></li> </ul> </li> <input type="button" id="next" value="Следующий вопрос"> <input type="button" id="check" value="Проверить"> </ul> <script> var checkEl = document.getElementById('check'); var nextEl = document.getElementById('next'); var questionsEl = document.getElementsByClassName('question'); var result = []; var now = 0; nextEl.addEventListener('click', next); checkEl.addEventListener('click', checkAnswers); var c; function captcha(){ let a = Math.ceil(Math.random() * 10) let b = Math.ceil(Math.random() * 10) c = a + b document.getElementById('text').innerHTML='Сколько будет ' + a + ' + ' + b + '?'; } function checkCaptcha(){ d = document.getElementById('captchaEdit').value; if(d == c) { alert('Правильный ответ!'); document.getElementById('icapt').style.display = 'none' document.getElementById('test').style.display = 'block' showAnswer(); now++; } else { alert('Неправильный ответ, попробуйте еще раз.') captcha() } } function next() { showAnswer(); now++ if (!questionsEl[now]) { nextEl.style.display = 'none'; checkEl.style.display = 'block'; } } function showAnswer() { for (var i = 0; i < questionsEl.length; i++) { questionsEl[i].style.display = 'none'; } questionsEl[now].style.display = 'block'; } function checkAnswers() { for (var i = 0; i < questionsEl.length; i++) { var answers = questionsEl[i].querySelectorAll('input[type=checkbox], input[type=radio], input[type=text]'); result.push( checkOneAnswer(answers) ); } printResult(); result = []; } function checkOneAnswer(answers) { var result = 0; var {length} = [...answers].filter( a => a.checked); for (var i = 0; i < answers.length; i++) { var answer = answers[i]; var text = answer.type == 'text'; if(text) { var val = answer.value.trim(); if(!val) return null; var data = answer.dataset.true; result += data === val; } else { if(!length) return null; result += answer.checked == answer.hasAttribute('data-true'); }} return result == answers.length ? true : !result ? null : false; } function printResult() { var trueAnswers = 0; var falseAnswers = 0; var noAnswers = 0; for (var i = 0; i < result.length; i++) { if (result[i] === true) { trueAnswers++; } else if (result[i] === false) { falseAnswers++; } else if (result[i] === null) { noAnswers++; } } var all = trueAnswers + falseAnswers + noAnswers; var percent = Math.round((trueAnswers/all) * 100); var msg = 'Правильных ответов: ' + trueAnswers + ' (' + percent + '%)\n' + 'Неправильных ответов: ' + falseAnswers + '\n' + 'Без ответов: ' + noAnswers + '\n'; alert(msg); } captcha(); </script> </body> </html> |
рони, увы, но так и засчитывает, будто бы пропустили эти вопросы просто... так странно
|
Alena_03,
исправил, смотрите код снова #12. |
рони, у меня просто нет слов, чтобы описать благодарность, работает) спасибо огромное вам. Могу узнать какие строки редачили?
|
laimas, вам тоже спасибо огромное
|
Цитата:
|
рони, спасибо ещё раз)
|
Часовой пояс GMT +3, время: 19:17. |