Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.06.2019, 05:19
Интересующийся
Отправить личное сообщение для Freestyle007 Посмотреть профиль Найти все сообщения от Freestyle007
 
Регистрация: 17.06.2019
Сообщений: 21

Подсчет оценок в тесте 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 нет... =(
Ответить с цитированием
  #2 (permalink)  
Старый 20.06.2019, 10:21
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Freestyle007,
лучше забыть что есть document.write, для вывода данных есть другие методы, document.write только для момента загрузки используется.
Ответить с цитированием
  #3 (permalink)  
Старый 20.06.2019, 14:47
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

var sum = 10;
alert(sum + true);
alert(+(sum>0));
sum = 0;
alert(sum + true);
alert(+(sum>0));
Ответить с цитированием
  #4 (permalink)  
Старый 20.06.2019, 14:57
Интересующийся
Отправить личное сообщение для Freestyle007 Посмотреть профиль Найти все сообщения от Freestyle007
 
Регистрация: 17.06.2019
Сообщений: 21

Dilettante_Pro, любопытно... Не знал, про такую особенность. Но проблема ещё в том, что оценка должна быть по 5-ти бальной шкале, где 5 - максимальная оценка.
Ответить с цитированием
  #5 (permalink)  
Старый 20.06.2019, 15:11
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Freestyle007,
Это ответ на вопрос
Сообщение от Freestyle007
чтобы при выборе правильных результатов возвращалась единица
А откуда у вас берется 5-балльная шкала, я не знаю
Ответить с цитированием
  #6 (permalink)  
Старый 21.06.2019, 04:44
Интересующийся
Отправить личное сообщение для Freestyle007 Посмотреть профиль Найти все сообщения от Freestyle007
 
Регистрация: 17.06.2019
Сообщений: 21

Сообщение от Dilettante_Pro Посмотреть сообщение
Freestyle007,
Это ответ на вопрос

А откуда у вас берется 5-балльная шкала, я не знаю

Вот по этой формуле она высчитывается
mark=1+Math.round(4*gc/tc*2/tc);
Ответить с цитированием
  #7 (permalink)  
Старый 21.06.2019, 10:50
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

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);

Последний раз редактировалось Dilettante_Pro, 21.06.2019 в 10:56.
Ответить с цитированием
  #8 (permalink)  
Старый 21.06.2019, 13:14
Интересующийся
Отправить личное сообщение для Freestyle007 Посмотреть профиль Найти все сообщения от Freestyle007
 
Регистрация: 17.06.2019
Сообщений: 21

Если использовать тест только с одни значением, используя 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", всё наперекосяк
Ответить с цитированием
  #9 (permalink)  
Старый 21.06.2019, 17:09
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

При использовании чекбокса суммирование надо делать так:

gc.value  =  +gc.value   + +(sum>0);


А как ваша формула может правильно считать оценку - мне непонятно.
Смотрите пример в пост№7
Ответить с цитированием
  #10 (permalink)  
Старый 24.06.2019, 10:34
Интересующийся
Отправить личное сообщение для Freestyle007 Посмотреть профиль Найти все сообщения от Freestyle007
 
Регистрация: 17.06.2019
Сообщений: 21

Сообщение от Dilettante_Pro Посмотреть сообщение
При использовании чекбокса суммирование надо делать так:

gc.value  =  +gc.value   + +(sum>0);


А как ваша формула может правильно считать оценку - мне непонятно.
Смотрите пример в пост№7
Спасибо, теперь в тесте с использованием "checkbox" подсчитывается правильно.
По поводу подсчета оценки, правильно работает по 5 бальной шкале только подсчет без использования "checkbox", т.е. при использовании "radio". При использовании "checkbox" - максимальную оценку получаем 4. Не понимаю как исправить, и совсем отказываться от "checkbox" не хочется.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчет оценок asdasdasd Общие вопросы Javascript 6 06.10.2010 21:18