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

Infinion

Постоялец
Регистрация
10 Фев 2009
Сообщения
71
Реакции
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". Это было бы еще лучше и проще.

Подскажите, пожалуйста, как такое сделать.
 
вместо 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;}
 
Спасибо, но сейчас испытал - первый скрипт, который должен 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>
 
Вообще неплохо бы и на html код поглядеть...
Так предварительно я думаю, нужно создать в html коде скрытое текстовое поле с id="result2" а в яваскрипте объявить
var result2=document.getElementById('result'2);
 
Да, спасибо, уже разобрался (методом научного тыка :) )

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

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