Проверка формы. RADIOs

Sash [None]

Новичок
Проверка формы. RADIOs

Кое как проверять формы я научился, всё даже работает, но большое обилие джаваскриптов напрягает. Возможно ли оптимизировать, сделать универсальный проверяльщик для формы типа:

...radio" name="a[0]" value="1">
...radio" name="a[0]" value="2">
...radio" name="a[0]" value="3">

...radio" name="a[1]" value="1">
...radio" name="a[1]" value="2">

Так вот, надо проверить, чтобы в каждой группе radio был выбран пункт.

Пробовал через document.form.length, но что-то не получается.
З.Ы. Группы генерируются РНР скриптом, и количество пунктов может быть разным.
HELP!:(
 

ForJest

- свежая кровь
Пробовал через document.form.length, но что-то не получается.
Ну так им родимым - и вперёд. Выдираешь из element.name текущий индекс и всё. При смене индекса на новый - проверяешь нажата хотя бы одна кнопка или нет и обнуляешь флаг.
 

Sash [None]

Новичок
Так в том то и дело, я не знаю, как узнать коичество кнопок. А во-вторых, при проверке получается название типа a[1][1], которое у меня не воспринимается... :( Как надо обозвать то всё это? И определить количество кнопок в одной радиогруппе?
 

sergadm

Новичок
берёш длдину массива element отнимаешь кол во левых обектов получаеш число радио. либо из пхп(там то ты знаеш их число ) печатай "var kol=x;"
а зачем a[1][1]? проверяй a[1].value если значение выставленно значит выбрали
 

Sash [None]

Новичок
У меня там только радио. :) Только дело в том, что... он считает не группы, а сами точки. Т.е. если у меня пять груп по четыре точки, то он выдаст 20. И что я буду с этой двадцаткой делать?

-~{}~ 25.03.04 07:13:

К тому же есть вероятность того, что значение (value) будет равно нулю. Стало быть в этом случае тоже выдаст ошибку незаполнения. Я слышал про такую фишку a[1].checked==true но, это на конкретный поинт работает. Если бы у меня были группы поинтов типа а1, а2, а3... то это было бы просто, (if document.form.a1.checked==true){} но у меня массив для РНР формируется, по этому название переменной a[1]... и т д...
 

IntenT

SkyDiver
Sash [None]
Вопррос..
А каким боком это к пхп имеет отношение???

хинт. Форму надо проверять в скрипте (пхп).
ПРоверка формы Жабаскриптом - пустая трата времени.
Если неправильно - футболить назад и говорить что введено неправильно.
 

Sash [None]

Новичок
Автор оригинала: IntenT
Sash [None]
Вопррос..
А каким боком это к пхп имеет отношение???
По данным MySQL базы формируется тест с вариантами ответа. Нужно проверить, не забыл ли человек где-нить поставить точку, если забыл ткнуть его в то место. А по 10 раз гонять пользователя туда сюда, да ещё чеки расставлять, это самоубийство, и действительно пустая трата времени.

-~{}~ 25.03.04 16:17:

Ну так что, никто помочь не может? :(
 

Линк

Guest
[глупость убрал. читать следующий ответ:0]
 

Sash [None]

Новичок
Во первых не чекбоксы а радиобутанны, Во вторых все, но по группам. В третьих их имя должно быть именно таким "a[1]" у первой группы, "a[2]" у второй, и т.д.

-~{}~ 25.03.04 18:53:

Попробую ещё раз:
<form name="form">
Группа 1<br>
<input type="radio" name="a[1]" value="0"><br>
<input type="radio" name="a[1]" value="1"><br>
<input type="radio" name="a[1]" value="2"><br>
<input type="radio" name="a[1]" value="3"><br>
Группа 2<br>
<input type="radio" name="a[2]" value="0"><br>
<input type="radio" name="a[2]" value="1"><br>
<input type="radio" name="a[2]" value="2"><br>

<input type="button" onclick="javascript:check();" value="check"><br>
</form>
Количество групп меняется, количество поинтов в группах тоже. Нужно удостовериться, что в каждой группе отмечен поинт. Пробовал назначить один id каждому поинту в группе, не получается. Голова лопается. Помогите пожалуйста.
 

Линк

Guest
Код:
<FORM METHOD=POST ACTION="">
<INPUT TYPE="radio" NAME="a[1]" value="A">
<INPUT TYPE="radio" NAME="a[1]" value="B">
<INPUT TYPE="radio" NAME="a[1]" value="C">
<INPUT TYPE="radio" NAME="a[1]" value="D" checked>

<INPUT TYPE="radio" NAME="a[2]" value="A">
<INPUT TYPE="radio" NAME="a[2]" value="B" checked>
<INPUT TYPE="radio" NAME="a[2]" value="C">
<INPUT TYPE="radio" NAME="a[2]" value="D">
</FORM>
<SCRIPT LANGUAGE="JavaScript">
all_radio=3;
for (i=1;i<all_radio;i++)
{
	len=document.forms[0].elements['a['+i+']'].length;
	for(i2=0;i2<len;i2++)
	{
		if (document.forms[0].elements['a['+i+']'][i2].checked){alert(' группа '+i+" значение "+document.forms[0].elements['a['+i+']'][i2].value)}
	}
}
</SCRIPT>
так что ль?

-~{}~ 25.03.04 19:18:

PS
ну а если вместо алерта класть в массив myar=true то потом легко обойти этот массив и узнать у каких групп нет значения

PPS: совет делай одну checked и юзверь ФИЗИЧЕСКИ не сможет запостить форму не выбрав хотябы одну))
 

Sash [None]

Новичок
Я не могу предложить вариант по дефаулту, к тому же можно будет запутаться. :( Так что спасибо, попробую. И алертом надо выводить не то что отмечено, а то, что не отмечено. :( Вот...
Щас разбираю твой скрипт, и не могу понять, для чего вот это
all_radio=3; количество групп? Хм... ладно, пхпхой могу указать их количество... попробую.
 

Линк

Guest
all_radio=3; количество групп?
количество групп+1 ))

надеюсь, ты достаточно хорошо умеешь прогить что бы основываясь но моем (наверное не шибко красивом) скрипте написать свой?
собственно говоря я это и имел ввиду: дать тебе hint, в какую сторону копать, а не готовый скрипт:)
 

Sash [None]

Новичок
ВСЁ!!! ЗАРАБОТАЛО!!! ВЫКЛАДЫВАЮ ДЛЯ БУДУЩЕГО ПОКОЛЕНИЯ:
$required - строка с именами радио. ("a[0]", "a[1]", "a[2]")
$required_show - строка с выводимыми вопросами. ("Первый вопрос", "Второй вопрос", "Третий вопрос")

<script language="JavaScript">
function checkform () {
required = new Array($required);
required_show = new Array($required_show);
biglength=required.length;
for (i=0;i<biglength;i++){
smallenght=document.forms[0].elements['a['+i+']'].length;
ok=false;
for (j=0;j<smallenght;j++){
if (document.forms[0].elements['a['+i+']'][j].checked){ok=true;}
}
if (!ok){alert("Ответте пожалуйста: "+required_show+"."); return false;}
}
return true;
}
</script>

PS Если бы ещё можно было бы заменить ['a['+i+']'][j] на required[j]... ну или что-то такое.
 

гоша

Guest
на самом деле, можно написать так, что всё равно сколько групп и как называются. Например:

Код:
function check_radios(frm){
	var cc=[];
	for(var i=0;i<frm.length;i++)
		if(frm[i].type=='radio')
			cc[frm[i].name]=(cc[frm[i].name] || 0) + frm[i].checked
	for(var p in cc)
		if(!cc[p])
			return false;
	return true;
}
 
Сверху