Подсчет оценок в тесте chekbox
Ребята, помогите разобраться, с checkbox, чтобы при выборе правильных результатов возвращалась единица. Вот пример страницы с тестом:
<!doctype html public "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=koi8-r" /> </head> <body > <form name="myform"> <p>Выберите один или несколько вариантов<br> <label> <input type="checkbox" name="testChbx" value="v1"> Вариант 1</label> <br> <label> <input type="checkbox" name="testChbx" value="v2"> Вариант 2</label> <br> <label> <input type="checkbox" name="testChbx" value="v3"> Вариант 3</label> <br> <label> <input type="checkbox" name="testChbx" value="v4"> Вариант 4</label> <br> </p> </form> <div id=soder><A href="mark.html" onClick="calc();">Оценка</a></div> <script type="text/javascript"> function calc(){ var chbx = myform['testChbx']; var sum=0; var gc=parent.stat.document.forms.stat.good; for(var i = 0; i < chbx.length; i++){ if(chbx[i].checked && (chbx[i].value == 'v2' || chbx[i].value == 'v4')) { sum++; } gc.value=(sum+true); } } </script> </body> </html> Собственно функция calc() не работает так как надо. Выражение (sum+true); - возвращает единицу, и присваивает её переменной gc.value, но при подсчете выполненных тестов в верхнем фрейме, значение gc.value изменяется и прибавляет 2 единицы вместо одной. Получается, что тестов выполнено скажем 4 из 3 возможных. Вот страница mark.html на которой происходит подсчет оценок: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> <html><head> <meta http-equiv="Content-Type" content="text/html; charset=koi8-r" /> </head> <body> <script type="text/javascript"> var frm=parent.stat.document.forms.stat; // переменная обращающаяся к фрейму stat (окно ind_up.html), форме stat var ntop=frm.ntop.value; //переменная содержащая номер темы var tc=frm.total.value; //переменная содержащая общее количество тестов в теме var gc=frm.good.value; //переменная содержащая решенные тесты в теме var mark=1+Math.round(4*gc/tc*2/tc); var tdo='<h1>Ваша оценка: '; var tpo='</h1>'; var noThems='<h1>Вы не сдали тему.</h1>'; if(gc<1)mark=1; if(mark<2){ parent.setMark(ntop,mark); //передаёт оценку в окно index.html содержащую переменную setMark document.write(noThems+tdo+mark+tpo); }else{ parent.setMark(ntop,mark); document.write(tdo+mark+tpo); } document.oncontextmenu = function(){return false;}; // запрещает использовать правую кнопку мыши </script> <a href="ind_ex.html">...с начала</a> </body> </html> Подсчет оценки выполняется по формуле var mark=1+Math.round(4*gc/tc*2/tc); Но! Опять старая проблем описанная в посте https://javascript.ru/forum/events/7...le-chrome.html В Forefox document.write() работает, в Google Chrome нет... =( |
Freestyle007,
лучше забыть что есть document.write, для вывода данных есть другие методы, document.write только для момента загрузки используется. |
var sum = 10; alert(sum + true); alert(+(sum>0)); sum = 0; alert(sum + true); alert(+(sum>0)); |
Dilettante_Pro, любопытно... Не знал, про такую особенность. Но проблема ещё в том, что оценка должна быть по 5-ти бальной шкале, где 5 - максимальная оценка.
|
Freestyle007,
Это ответ на вопрос Цитата:
|
Цитата:
Вот по этой формуле она высчитывается mark=1+Math.round(4*gc/tc*2/tc); |
Freestyle007,
У вас в gc после каждого теста перезаписывается 0 или 1, а нужно суммировать с предыдущими значениями. Правда, ваша формула мне непонятна: Например, 6 правильных ответов из 10 var gc = 6, tc = 10; var mark=1+Math.round(4*gc/tc*2/tc); alert(mark); Может, как-то так? var gc = 6, tc = 10; var mark=Math.round(5 * gc/tc); alert(mark); |
Если использовать тест только с одни значением, используя input type="radio" , то формула mark=1+Math.round(4*gc/tc*2/tc); считает оценку корректно, например
<body> <form name="myform"> <p>Выберите правильный ответ. <label> <input type="radio" name="myname" value="v1"> Вариант 1</label> <br> <label> <input type="radio" name="myname" value="v2"> Вариант 2 </label> <br> <label> <input type="radio" name="myname" value="v3"> Вариант 3</label> <br> <label> <input type="radio" name="myname" value="v4"> Вариант 4</label> </p> </form> <DIV id=soder><A href="test2" onClick="calc();">Следующий тест</a></div> <script type="text/javascript"> function calc(){ var gc=parent.stat.document.forms.stat.good; if(myform.myname.value == 'v3') {gc.value++;} else{return;} } </script> </body> Но при использовании input type="cheсkbox", всё наперекосяк |
При использовании чекбокса суммирование надо делать так:
gc.value = +gc.value + +(sum>0); А как ваша формула может правильно считать оценку - мне непонятно. Смотрите пример в пост№7 |
Цитата:
По поводу подсчета оценки, правильно работает по 5 бальной шкале только подсчет без использования "checkbox", т.е. при использовании "radio". При использовании "checkbox" - максимальную оценку получаем 4. Не понимаю как исправить, и совсем отказываться от "checkbox" не хочется. |
Если подойти к проблеме с другой стороны, при использовании "checkbox", если выбрать все 4 варианта, как сделать, чтобы тест не был засчитан и вернулся "0" ?
Скрипт работает, но не совсем так как надо: <script type="text/javascript"> function calc(){ var chbx = myform['testChbx']; var sum=0; var gc=parent.stat.document.forms.stat.good; for(var i = 0; i < chbx.length; i++){ if(chbx[i].checked && (chbx[i].value == 'v2' || chbx[i].value == 'v4')) { sum++; } else if (sum<=0){ sum=0;} } gc.value = +gc.value+ +(sum>0); } </script> |
Freestyle007,
Цитата:
|
Тут ситуация не однозначная: если 1,2,3 варианты, 4 не выбирать - то возвращает "0"; если 1,3,4 варианты, 2 не выбирать - то возвращает "1". При условии, что правильные ответы: 2 и 4.
Что-то я себе уже ум сломал... |
Цитата:
Например, за отмеченный правильный ответ добавлять к sum 1, за неправильный - вычитать 1. И если sum будет положительная, то вернется 1, иначе 0. И проверять не так if(chbx[i].checked && (chbx[i].value == 'v2' || chbx[i].value == 'v4')) а по массиву правильных ответов. |
Цитата:
|
Несколько упрощенный макет
<input id="gc" disabled> <form name="myform"> <p>Выберите один или несколько вариантов<br> <label> <input type="checkbox" name="testChbx" value="v1"> Вариант 1</label> <br> <label> <input type="checkbox" name="testChbx" value="v2"> Вариант 2</label> <br> <label> <input type="checkbox" name="testChbx" value="v3"> Вариант 3</label> <br> <label> <input type="checkbox" name="testChbx" value="v4"> Вариант 4</label> <br> </p> </form> <div id="soder" onclick="calc(0);">Оценка</div> <script type="text/javascript"> var answers = [["v2","v4"],["v7","v8"],["v10"]]; //Массив правильных ответов по 3 билетам function calc(ticket){ var chbx = myform['testChbx']; var sum=0; for(var i = 0; i < chbx.length; i++){ if(chbx[i].checked) { sum += answers[ticket].indexOf(chbx[i].value) > -1?1:-1; } } gc.value = +gc.value+ +(sum>0); } </script> Пример крутится на одном билете. Номер билета - параметр для функции calc. Массив правильных ответов - просто для иллюстрации, как выглядит. В этом примере правильные и неправильные варианты имеют одинаковые веса с противоположным знаком +-1 Можно сделать, чтобы один неправильный ответ обнулял весь результат по билету. |
Отлично! А как сделать, чтобы при выборе неправильного ответа обнулялся результат?
|
Цитата:
|
Проверил, не работает ни так
sum += answers[ticket].indexOf(chbx[i].value) > -1?1:-10; ни так sum += answers[ticket].indexOf(chbx[i].value) > -1?1:-1; <div id="soder" onclick="calc(0);">Оценка</div> <script type="text/javascript"> var answers = [["v2","v4"]]; //Массив правильных ответов по 3 билетам function calc(ticket){ var chbx = myform['testChbx']; var sum=0; for(var i = 0; i < chbx.length; i++){ if(chbx[i].checked) { sum += answers[ticket].indexOf(chbx[i].value) > -1?1:-1; } } gc.value = +gc.value+ +(sum>0); } </script> Не совсем понял это выражение: -1?1:-1, что в скобках, что без скобок отдаёт "0"; И подсчет оценки в gc.value не происходит |
Цитата:
Цитата:
answers[ticket].indexOf(chbx[i].value) > -1?1:-1; Описание смотрите здесь Цитата:
Так у вас работать не будет. Надо учитывать различия в html |
Ну да, скопировал, чтобы разобраться как работает, но так и не понял выражение
answers[ticket].indexOf(chbx[i].value) > -1?1:-1; Не понятно откуда берется "ticket" в коде, и как точно работает выражение "-1?1:-1;" Выражение gc.value = +gc.value+ +(sum>0);значение в верхнем фрейме не меняет. В вашем примере Пост16 все работает, хочу всё-таки понять, как можно сделать тест с использованием "checkbox", и получать результат равный при использовании "radio". |
Freestyle007,
Внимательно прочитайте предыдущие ответы - там все есть. И изучайте JS |
Часовой пояс GMT +3, время: 21:04. |