Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Проверка отметки radiobutton не работает (https://javascript.ru/forum/dom-window/10869-proverka-otmetki-radiobutton-ne-rabotaet.html)

boris2000 25.07.2010 20:04

Проверка отметки radiobutton не работает
 
Подскажите что делаю не так.
Есть форма, и надо проверить во всех ли группах radiobutton пользователь сделал отметку (любую? главное чтобы все отметил). Скрипт прилагаю - не работает!


// сперва функция проверки radiobutton
function getCheckedValue(radioObj) {
	if(!radioObj)
		return "";
	var radioLength = radioObj.length;
	if(radioLength == undefined)
		if(radioObj.checked)
			return radioObj.value;
		else
			return "";
	for(var i = 0; i < radioLength; i++) {
		if(radioObj[i].checked) {
			return radioObj[i].value;
		}
	}
	return "";
}

// основная функция проврки и отправки формы
function CallOnSubmit(){
// массив с именами обязательных к заполнению radiobutton
var obligatory_radiobutton_array = ["articletype", "studycoverage", "studysampling", "studiedpopulationage", "studiedpopulationsex", "studiedpopulationurbanicity", "studydesign", "studyfollowup", "otherriskfactors"];
var obligatory_radiobutton_names_array = ["Article type", "Study population coverage", "Study sampling strategy", "Studied population age", "Studied population sex", "Studied population urbanicity", "Study design", "Does study include follow-up", "Do risk factors for CKD in studied population are reported"];

var string4notice = "";
for(j = 0; j <= obligatory_radiobutton_array.length; j++) {
	if (getCheckedValue(document.forms['aef'].elements[obligatory_radiobutton_array[j]]) = ""){
		string4notice = string4notice + "\n\r" + obligatory_radiobutton_names_array[j];
	}
}

if(string4notice != ""){
	string4notice = "Please note the following questions have to be answered before Abstract estimation form submission:" + "\n\r" + string4notice;
	confirm (string4notice);
}

	return false;
}


код формы
<form action="examination_step2.php" method="post" name="aef" target=_parent>

<BUTTON TYPE = BUTTON ONCLICK="CallOnSubmit();">Check</BUTTON><br>

<div class="abstract_estimation_list"><label><input type="radio" name="studydesign" value="1" />case-control study</label><br />
<label><input type="radio" name="studydesign" value="2" />cross-sectional study</label><br />
<label><input type="radio" name="studydesign" value="3" />retrospective cohort study</label><br />
<label><input type="radio" name="studydesign" value="4" />prospective cohort study</label><br />
<label><input type="radio" name="studydesign" value="5" />randomized controlled trial</label><br />
<label><input type="radio" name="studydesign" value="6" />registry report</label><br />
<label><input type="radio" name="studydesign" value="0" />not reported</label><br /></div>

 ...
и так далее для каждой группы перечисленной в массиве obligatory_radiobutton_array
...

</form>

JsLoveR 25.07.2010 20:13

boris2000,
отформатируйте код в Вашем посте. Покажите код формы и что это if(string4notice<>"") ?

exec 25.07.2010 20:17

j <= obligatory_radiobutton_array.length


Здесь очевидно выбивает ошибку, т.к. в последней итерации obligatory_radiobutton_array[j] равен undefined, т.к. length всегда на один больше кол-ва эл-тов в массиве.

float 25.07.2010 20:35

Цитата:

и что это if(string4notice<>"") ?
Наверное, автор подразумевал ==...

boris2000 25.07.2010 20:46

if(string4notice<>"") - имеется в виду что если получившееся сообщение в string4notice не пустое, то значит какие-то флажки не были отмечены и надо выдать пользователю напоминание чтобы он все отметил.

приписал -1 в код чтобы длина массива не превышала числа его значений, все равно не работает
for(j = 0; j <= obligatory_radiobutton_array.length - 1; j++) {

boris2000 25.07.2010 20:48

испарвил на просто < - не работает

for(j = 0; j [COLOR="Red"]<[/COLOR] obligatory_radiobutton_array.length; j++) {

JsLoveR 25.07.2010 21:23

Цитата:

Сообщение от boris2000
имеется в виду что если получившееся сообщение в string4notice не пустое

if(string4notice!="")

boris2000 25.07.2010 21:57

спасибо, исправил на !-. Но все равно не работает! А ведь вроде бы должно!

boris2000 25.07.2010 22:06

Путем исключения отдельных строк комментариями установил что работает все по отдельности кроме строчки
if (getCheckedValue(document.forms['aef'].elements[obligatory_radiobutton_array[j]]) = ""){

может я как-то не так ссылаюсь на объект формы?
я в JS вообще мало разбираюсь, тем более в таких вещах, я на php программирую, а в этой страничке без JS никуда ...

JsLoveR 25.07.2010 22:07

getCheckedValue(document.forms['aef'].elements[obligatory_radiobutton_array[j]]= "")

ххх, опередили))

boris2000, у Вас как-то всё кривовато, почему просто не пробегаться по всем чекбоксам и не собирать у выделенных чекбоксах value? Вам нужно просто выбранные value собирать?

boris2000 25.07.2010 22:19

спасибо, исправил. Самое потрясающее что все-равно не работает.

не работает даже отдельная кнопка с этой функцией
<BUTTON TYPE = BUTTON ONCLICK="getCheckedValue(document.forms['aef'].elements['articletype']);">Check2</BUTTON><br>

boris2000 25.07.2010 22:21

мне нужно понять в каких группах radiobutton не сделано никакого выбора, и показать пользователю напоминание о них, и форму не отправлять до тех пор пока хоть какой-то выбор во всех нужных группах не сделает.
но в принципе и выбранные value наверное будет достаточно для этого. если value не число - значит и выбора не было? или не так?

float 25.07.2010 22:27

Цитата:

if (getCheckedValue(document.forms['aef'].elements[obligatory_radiobutton_array[j]]) = "")
Сравнение делается так ==

JsLoveR 25.07.2010 22:28

В value можно сохранить имена чекбоксов.
float, угу)

boris2000 25.07.2010 22:30

Цитата:

Сообщение от float (Сообщение 65156)
Сравнение делается так ==

спасибо, исправил. но ведь не работает!

float 25.07.2010 22:31

Besides all.
getCheckedValue не делает перебор элементов раз.
Она возвращает value, а у вас в 1-м НОЛЬ стоит, который преобразуется в false

float 25.07.2010 22:33

Поясните что вы хотите от скрипта, возможно его проще переписать, чем переделать;)

boris2000 25.07.2010 22:33

Цитата:

Сообщение от JsLoveR (Сообщение 65158)
В value можно сохранить имена чекбоксов.

не подскажите как это делается? я в JS, мягко говоря, не очень.

и еще один важный момент - в форме есть не только radiobutton, но и флажки checkbox - а для них мне будет нужна отдельная функция, потому что они там сложно объединены в группы.
поэтому надо "пробегаться" очень избирательно. это возможно?

boris2000 25.07.2010 22:40

Цитата:

Сообщение от float (Сообщение 65161)
Поясните что вы хотите от скрипта, возможно его проще переписать, чем переделать;)

у меня в форме набор из radiobutton, checkbox и текстовых полей.
мне надо чтобы перед отправкой формы шла проверка - все ли radiobutton пользователь отметил. если не все - выдавать ему предупреждение и форму не отправлять.

с checkbox все сложнее. они сгруппированы по смыслу, при этом имена checkbox из одной смысловой группы разные, например как в этом кусочке кода, в котором все флажки входят в одну смысловую группу
<div class="abstract_estimation_h3">Nephrological (urological) abstract topics:<a href="/gbd/mediawiki/index.php/Abstract_estimation_form" target=helpwindow><img src="/gbd/images/info_16.png" alt="" border=0></a></div>
<div class="abstract_estimation_list"><label><input type="checkbox" name="nosology_ckdonly" value="1" onclick="enableTxtField(this)"  />only CKD in total without specifying nosology</label></div>
<div class="abstract_estimation_list"><label><input type="checkbox" name="nosology_ckdwithdetails" value="1" onclick="enableTxtField(this)"  />CKD with kidney diseases nosology evaluation after initial screening</label></div>
<div class="abstract_estimation_list"><label><input type="checkbox" name="nosology_chronicgn" value="1" onclick="enableTxtField(this)"  />chronic glomerulonephritis</label></div>
<div class="abstract_estimation_list"><label><input type="checkbox" name="nosology_acutegn" value="1" onclick="enableTxtField(this)"  />acute glomerulonephritis</label></div>
<div class="abstract_estimation_list"><label><input type="checkbox" name="nosology_chronicpn" value="1" onclick="enableTxtField(this)"  />chronic pyelonephritis</label></div>
<div class="abstract_estimation_list"><label><input type="checkbox" name="nosology_chronictin" value="1" onclick="enableTxtField(this)"  />chronic tubulointersticial nephritis</label></div>
<div class="abstract_estimation_list"><label><input type="checkbox" name="nosology_urolithiasis" value="1" onclick="enableTxtField(this)"  />urolithiasis</label></div>

<div class="abstract_estimation_list"><label><input type="checkbox" name="nosology_congenital" value="1" onclick="enableTxtField(this)"  />congenital GU malformations</label></div>
<div class="abstract_estimation_list"><label><input type="checkbox" name="nosology_hereditary" value="1" onclick="enableTxtField(this)"  />heredetary kidney diseases</label></div>
<div class="abstract_estimation_list"><label><input type="checkbox" name="nosology_hypertensive" value="1" onclick="enableTxtField(this)"  />hypertensive kidney disease</label></div>
<div class="abstract_estimation_list"><label><input type="checkbox" name="nosology_dm1" value="1" onclick="enableTxtField(this)"  />diabetic nephropathy in type 1 DM</label></div>
<div class="abstract_estimation_list"><label><input type="checkbox" name="nosology_dm2" value="1" onclick="enableTxtField(this)"  />diabetic nephropathy in type 2 DM</label></div>
<div class="abstract_estimation_list"><label><input type="checkbox" name="nosology_dmunknown" value="1" onclick="enableTxtField(this)"  />diabetic nephropathiy without DM type detalisation</label></div>
<div class="abstract_estimation_list"><label><input type="checkbox" name="nosology_bph" value="1" onclick="enableTxtField(this)"  />benign prostatic hypertrophy</label></div>
<div class="abstract_estimation_list"><label><input type="checkbox" name="nosology_esrd" value="1" onclick="enableTxtField(this)"  />end-stage renal disease</label></div>
<div class="abstract_estimation_list"><label><input type="checkbox" name="nosology_arf" value="1" onclick="enableTxtField(this)"  />acute renal failure</label></div>

<div class="abstract_estimation_list"><label><input type="checkbox" name="nosology_other" value="1" onclick="enableTxtField(this)"  />other</label> <input type="text" name="nosology_otheradd" id="nosologyother" size="50" value="" disabled="true"></div>


если пользователь выбрал хотя бы один из флажков смысловой группы, то это меня устраивает. если не выбрал ни один из флажков смысловой группы - опять же, надо показать ему предупреждение с названием смысловой группы.

я начал с radiobutton потому что вроде как с ними ситуация попроще. но оказалось - не так:(

float 26.07.2010 00:22

Я предлагаю так

сделайте это объектом:
var obligatory_radiobutton_array = {'name1': 0, 'name2': 0, и т.д.};

Функция обработчик должна делать следующее:

1. выбрать все элементы формы и перебрать их;
2. в каждом переборе спросить у инпута его имя, тип и выбран ли он;
3. если выбран => смотрим есть ли в obligatory_radiobutton_array свойство=имени инпута;
если да, делаем его = 1;
4. делаем перебор obligatory_radiobutton_array. Если есть хоть одно свойство = 0, вызаваем функцию с оповещением, возвращаем фолс

boris2000 27.07.2010 22:48

ура!!!!получилось!!!!
вот так:
function getSelectedRadio(buttonGroup) {
   // returns the array number of the selected radio button or -1 if no button is selected
   if (buttonGroup[0]) { // if the button group is an array (one button is not an array)
      for (var i=0; i<buttonGroup.length; i++) {
         if (buttonGroup[i].checked) {
            return i
         }
      }
   } else {
      if (buttonGroup.checked) { return 0; } // if the one button is checked, return zero
   }
   // if we get to this point, no radio button is selected
   return -1;
} // Ends the "getSelectedRadio" function

// основная функция проврки и отправки формы
function CallOnSubmit(){
var string4notice = "";
// массив с именами обязательных к заполнению radiobutton
var obligatory_radiobutton_array = ["articletype", "studycoverage", "studysampling", "studiedpopulationage", "studiedpopulationsex", "studiedpopulationurbanicity", "studydesign", "studyfollowup", "otherriskfactors"];
var obligatory_radiobutton_names_array = ["Article type", "Study population coverage", "Study sampling strategy", "Studied population age", "Studied population sex", "Studied population urbanicity", "Study design", "Does study include follow-up", "Do risk factors for CKD in studied population are reported"];

var elements = document.forms["aef"].elements;
var element;
	
for(j = 0; j < obligatory_radiobutton_array.length; j++) {
	element = elements[obligatory_radiobutton_array[j]];
	if(getSelectedRadio(element) == -1){
		string4notice = string4notice + "\n\r" + obligatory_radiobutton_names_array[j];
	}
}


if(string4notice != ""){
	string4notice = "Please note the following questions have to be answered before Abstract estimation form submission:" + "\n\r" + string4notice;
	alert (string4notice);
}

	return false;
}


Часовой пояс GMT +3, время: 11:06.