Подсчет оценок в тесте 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" не хочется. |
| Часовой пояс GMT +3, время: 09:09. |