Помогите доработать скрипт (сложение, сравнение и вставка параметра)

Тема в разделе "JavaScript", создана пользователем Infinion, 6 фев 2012.

Модераторы: ZiX
  1. Infinion

    Infinion Постоялец

    Регистр.:
    10 фев 2009
    Сообщения:
    63
    Симпатии:
    12
    Друзья, столкнулся с одной проблемой, помогите, пожалуйста, доработать скрипт.
    Задача вроде простая, но т.к. я не силен в ява-скрипте - то для меня это проблема.
    (Хочу сделать у себя на сайте что-то вроде бесплатных психологических онлайн-тестов на базе компонента RSForm Pro)

    Есть готовый скрипт, который считает сумму числовых значений (=баллов) всех выбранных радио-кнопок и отдает эту сумму в скрытое поле "result":

    RSForm!Pro - How to perform radio group calculations
    In this article we will describe how to make a simple calculation with values from a radio group. Let suppose, for example, that we have the following components:
    1. Radio group:
    Name: radio1
    Caption: radio1
    Items: 1|Description1
    2|Description2
    3|Description3

    2. Radio group:
    Name: radio2
    Caption: radio2
    Items: 1|Description1
    2|Description2
    3|Description3

    3. Hidden field
    Name: result
    Default Value: 0

    4. Submit Button:
    Name: submit
    Label: submit
    Additional Attributes: onclick="calculate();"

    In the "Form Layout" tab, uncheck the "Auto Generate Layout" checkbox and paste the following Javascript code at the begging of the existing layout code:
    Код:
    function calculate()
    {
    var op1=document.getElementsByName('form[radio1]');
    var op2=document.getElementsByName('form[radio2]');
    var result=document.getElementById('result');
    result.value=0;
    result.value=parseInt(result.value);
    for(i=0;i<op1.length;i++)
    if(op1.checked) result.value=parseInt(result.value)+parseInt(op1.value);
    for(i=0;i<op2.length;i++)
    if(op2.checked) result.value=parseInt(result.value)+parseInt(op2.value);
    alert(result.value);
    return false;
    }
    In order to display the result of this calculation just the placeholder for the hidden field, in this case: {result:value}. This can be used in "Thank you" page as well as in any email configuration.


    А нужно доделать скрипт так, чтобы он сопоставил значение в поле "result" с заданным диапазоном значений и отдал в новое скрытое поле (напр. "result2") ссылку, соответствующую этому диапазону, т.е.:

    Если значение из поля "result" попадает в диапазон 0-20 - то в новое поле "result2" отдается ссылка №1
    Если значение из поля "result" попадает в диапазон 21-30 - то в новое поле "result2" отдается ссылка №2
    Если значение из поля "result" попадает в диапазон 31-40 - то в новое поле "result2" отдается ссылка №3 и т.д.

    Если возможно, то можно и без нового поля, чтобы скрипт считал значения и сопоставлял с диапазоном за один проход, и сразу отдавалась бы готовая ссылка в скрытое поле "result". Это было бы еще лучше и проще.

    Подскажите, пожалуйста, как такое сделать.
     
  2. dino

    dino

    Регистр.:
    28 май 2009
    Сообщения:
    550
    Симпатии:
    204
    вместо alert(result.value); подставь условия:
    if(result.value>0 && result.value<=20){result2.value=ссылка №1;}
    else if(result.value>20 && result.value<=30){result2.value=ссылка №2;}
    else if(result.value>30 && result.value<=40){result2.value=ссылка №3;}
     
    Infinion нравится это.
  3. Infinion

    Infinion Постоялец

    Регистр.:
    10 фев 2009
    Сообщения:
    63
    Симпатии:
    12
    Спасибо, но сейчас испытал - первый скрипт, который должен result давать, почему-то ничего не считает :(
    Выдает все время нулевое значение. Может там ошибка в скрипте, он вообще правильно написан?
    (Он взят из ФАКа на их офф-сайте)
    (С result2 пока не стал даже пробовать, т.к. почему-то не отрабатывается даже исходный вариант :( )

    UPD:

    В исходном скрипте была ошибка, забыли указать i, вот так сделал, и поле result стало вычисляться, но вот, если добавить в код строки, которые указал dino - то поле result перестает вычисляться (result2 тоже не вычисляется).

    Вот такой рабочий код для вычисления и подстановки в поле result:
    (Но проблема с вычислением и подстановкой в поле result2 так и не решена)

    Код:
    <script type="text/javascript">
    function calculate()
    {
    var op1=document.getElementsByName('form[quest1]');
    var op2=document.getElementsByName('form[quest2]');
    var op3=document.getElementsByName('form[quest3]');
    var result=document.getElementById('result');
     
    result.value=0;
     
    result.value=parseInt(result.value);
     
    for(i=0;i<op1.length;i++)
    if(op1[i].checked)
    result.value=parseInt(result.value)+parseInt(op1[i].value);
     
    for(i=0;i<op2.length;i++)
    if(op2[i].checked) result.value=parseInt(result.value)+parseInt(op2[i].value);
     
    for(i=0;i<op3.length;i++)
    if(op3[i].checked) result.value=parseInt(result.value)+parseInt(op3[i].value);
     
    return false;
    }
    </script>
    UPD2:

    Ура, в итоге разобрался!)) Код dino верен, только нужно было кое-что еще подправить. Вот финальный вариант:


    Код:
    <script type="text/javascript">
    function calculate()
    {
    var op1=document.getElementsByName('form[quest1]');
    var op2=document.getElementsByName('form[quest2]');
    var op3=document.getElementsByName('form[quest3]');
    var result=document.getElementById('result');
    var result2=document.getElementById('result2');
     
    result.value=0;
    result2.value=0;
     
    result.value=parseInt(result.value);
     
    for(i=0;i<op1.length;i++)
    if(op1[i].checked)
    result.value=parseInt(result.value)+parseInt(op1[i].value);
     
    for(i=0;i<op2.length;i++)
    if(op2[i].checked) result.value=parseInt(result.value)+parseInt(op2[i].value);
     
    for(i=0;i<op3.length;i++)
    if(op3[i].checked) result.value=parseInt(result.value)+parseInt(op3[i].value);
     
    if(result.value>0 && result.value<=3){result2.value="http://website.ru/1.html";}
    else if(result.value>3 && result.value<=6){result2.value="http://website.ru/2.html";}
    else if(result.value>6 && result.value<=9){result2.value="http://website.ru/3.html";}
     
     
    return false;
    }
    </script>
     
  4. dino

    dino

    Регистр.:
    28 май 2009
    Сообщения:
    550
    Симпатии:
    204
    Вообще неплохо бы и на html код поглядеть...
    Так предварительно я думаю, нужно создать в html коде скрытое текстовое поле с id="result2" а в яваскрипте объявить
    var result2=document.getElementById('result'2);
     
    Infinion нравится это.
  5. Infinion

    Infinion Постоялец

    Регистр.:
    10 фев 2009
    Сообщения:
    63
    Симпатии:
    12
    Да, спасибо, уже разобрался (методом научного тыка :) )

    Просто нужно было объявить в коде:
    var result2=document.getElementById('result2');

    А также заключить ссылки в кавычки:
    {result2.value="ссылка";}