Newsgroup: it.comp.lang.javascript
Titolo: controllo oblligatorietà check e radio (html costruito dinamicamente)

Ciao,
ho un grande problema che non riesco a risolvere pienamente.
Costruisco la mia pagina HTML dinamicamente, in base a valori presenti in un
DB. Quindi se ad esempio in una determinata tabella o dei valori, nella
pagina potrò avere ad esempio '3' gruppi di checkbox; se ne ho altri, i
gruppi di checkbox magari sono soltanto 2 ed in più ho un gruppo di radio
(in più pescando i valori sempre dal DB non so nemmeno quanti sono i check
di ogni gruppo).
In sostanza non so a priori che elementi ho nella pagina.
Il problema nasce quando devo controllare (nell'onsubmit) se l'utente ha
ceccato almeno un valore per ogni gruppo di check (o radio).
Ho provato creando una variabile globale per ogni gruppo di check o radio e
aumentandola e dimiuendola di 1 ogni volta che seleziono o deseleziono un
elemento (funzione chiamata nell'onclick di ogni check). Poi nell'onsubmit
controllo il valore delle variabili (se una variabile è 0 non faccio
continuare).
Funziona, ma ho un problema. Il sito è composto da più pagine. Tutte le
volte che faccio il submit(ed i dati sono giusti) carico i dati nel DB ed
avanzo alla pagina successiva. Ad esempio nella pagina 1 ho un gruppo di
check (con valore obbliagtorio) e l'utente ha ceccato il 3°. Vado alla
pagina 2 e poi ritorno alla 1. Qui (rileggendolo dal DB) ho ancora ceccato
il 3° elemento, ma la variabile globale associata è a 0 (perchè non si è
scatenato l'evento onclick) e quindi se non tocco nulla e voglio tornare
alla pagina 2, non posso perchè nell'onsubmit la variabile è a 0.
Che fatica!!!!, spero di essere stato chiaro un po' chiaro.
Esiste un metodo più semplice?
In poche parole voglio un controllo dinamico di obbligatorietà per tutti i
gruppi di check e radio che possono essere presenti nella pagina (da tenere
in considerazione il fatto che non conosco a priori nè il loro numero, nè il
numero dei loro elementi).
Grazie mille.
Andrea.

 alla pagina 2, non posso perchè nell'onsubmit la variabile è a 0.
Se stai leggendo nel db che il check 3 è stato premuto perché in quella fase
non setti anche la variabile globale ?

On Tue, 7 Oct 2003 14:02:05 +0200, Marco Balestra wrote:
 
Non avevo mai notato l'x-face.. il figuro nella foto sei tu? :)
-- 
C'ya,
  ZER0 :: coder.gfxer.webDesigner();
"When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)

 l'unica cosa che "raggruppa" le checkboxes e` la form di cui sono parte)
No, aspe', perche' dici questo?
Se a piu' elementi della stessa form imposto lo stesso name, di fatto ho
creato un "gruppo" (o meglio, un array di controlli).
Che siano radio button, textfield, checkbox..


 sei certo di quello che dici?
Yep. Soprattutto per il controllo dei checkbox, ho sempre usato array :)


 qualche anno fa, ora i capelli sono ricresciuti :)
Nel senso che ora sei capellone? :) A me ormai, dubito che possano
ricrescere ;_;


 ora dovrebbe essere aggiornata ;o)
Uhaaa..! Che spettacolo :)
Appena ho un po' di tempo me la imposto anche io.. anche se dubito che ci
mettero' una foto. ^_-


Ciao,
ho innescato il caos.....
comunque intendevo proprio questo,
do ad un "gruppo" di checkbox lo stesso nome ed "id" diverso.
Andrea.

 dovuto usare librerie di funzioni non scritte direttamente da me ;o)
Ehehe. :)


Ciao,
ho risolto (quando rileggo le pagine con valori già inseriti) sommando 1
alle variabili globali se il check o il radio è ceccato.
Sembra funzionare, vorrei sapere solo se c'è un metodo più lineare.
Grazie.


[CUT]
... e poi non era questione di tifo ... (vedi
news:1g2eku7.jgbdh51myq4oqN%bale...@despammed.com
)
Vai ZERO vai
(Marco, sto scherzando)
Ktrl+S

 do ad un "gruppo" di checkbox lo stesso nome ed "id" diverso.
Se ho ben capito il tuo problema, ti basta fare un ciclo in una funzione da
associare all'onsubmit.
Qualcosa tipo:
function hasCheckBoxesChecked(sender){
	var bRetVal=0;
	if (typeof sender.length=="undefined")
		return sender.checked;
	else{
		for (var i=0;i<sender.length;i++)
			bRetVal|=sender[i].checked;
 
	}
	return bRetVal?true:false;
}
Da poi richiamare in una funzione di validazione form, passando
l'elemento/gruppo relativo. Esempio:
<script>
	function checkForm(frm){
		var errorMessage="";
		if (!hasCheckBoxesChecked(frm.chkBox))
			errorMessage+="- Selezionare almeno un checkbox 'chkBox'\n";
		if (!hasCheckBoxesChecked(frm.chkBoxA))
			errorMessage+="- Selezionare almeno un checkbox 'chkBoxA'\n";
 
		if (errorMessage!=""){
			alert("Attenzione!\n"+errorMessage);
			return false;
		}
		return true;
	}
	</script>
<form action="default.htm" method="get" onsubmit="return checkForm(this)">
	<input type="checkbox" name="chkBox" value="1" /><br />
	<input type="checkbox" name="chkBox" value="2" /><br />
	<input type="checkbox" name="chkBoxA" value="02" /><br />
	<input type="submit" />
</form>


 (Marco, sto scherzando)


 dimensioni/formati, ma viene una schifezza).
Danke, appena ho un attimo lo provo :)


 un solo elemento (e ora non dirmi che questo ti sembra corretto ;o)))
Ni. Nel senso che almeno cosi' e' uniformato al comportamento degli altri
elementi. :)


 con una batteria da venti minuti... che diventa vecchio dopo un mese.
Idem, infatti il mio e' un portatile aziendale. :)
Il giorno che dovro' comprare un portatile personale per lavorare, credo
proprio che optero' per un Mac (del resto, mi sto spostando sempre piu' su
linguaggi ed enviroment platform-independent anche per questo genere di
motivi)
Quel giorno, aspettati di ricevere mie notizie su "cosa comprare" :)


 do ad un "gruppo" di checkbox lo stesso nome ed "id" diverso.
Allora puoi procedere tranquillamente.
nell'onsubmit di ogni form chiami una funzione di verifica che cicli sul
vettore elements, qlcs del tipo:
<form onsubmit="return verificaForm(this);" >
ok ora funziona (ora lo testo nei casi più disperati), ho dovuto peò
cambiare 2-3 righe
function verificaForm(f) {
 var i,e,t,j,flag;
 for (i=0; i<f.elements.length; i++) {
  e = f.elements[i];
  if (e[0]) {                               -->  non l'hoaccetta ed ho
insertito  if (
e.name
!="") {
   flag = false;
   t = 0;
   for (j=0; j<e.length; j++) {                                        -->
al posto di "e"  f.elements
    if ((e[j].type=='checkbox')||(e[j].type=='radio')) {    --> al posto di
"e"  f.elements
     flag = true;
     if (e[j].checked) t++;                                              -->
al posto di "e"  f.elements
    }
   }
   if (flag && (t==0)) {
    alert('Manca il campo '+e[0].name);
    return false;
   }
  }
 }
 return true;
}
-- 
GRAZIE MILLE...è stata una faticata!!!!

Ti ringrazio per tutto il tempo che hai perso...
purtroppo funziona solo se io ho un solo "gruppo" di check (o radio)
obbligatorio
all'interno del form.
Se perň ho due o piů gruppi di check e/o radio obbligatori, mi richiede il
valore solo
per il primo e se poi premo submit va alla pagina successiva anche se gli
altri gruppi non
sono stati valorizzati.
Ciao.
Andrea.

 all'interno del form.
Curiosita': Ma un'occhiatina al mio post l'hai data?


mi sono perso?
ora riguardo

Mi correggo funziona per uno o più gruppi di radio, ma non per i check.
I check li ho definiti come segue:
INPUT type="checkbox" id="a" name="a1" value="1"
INPUT type="checkbox" id="a" name="a2" value="2"
.....
INPUT type="checkbox" id="a" name="an" value="n"
Così riprendo meglio i valori da inserire nel DB.
Andrea.

 INPUT type="checkbox" id="a" name="an" value="n"
Diventa:
<input type="checkbox" name="a" id="a1" value="1" />
<input type="checkbox" name="a" id="a2" value="2" />
<input type="checkbox" name="a" id="an" value="n" />


Ok, se chiamo i check allo stesso modo funziona.
Ora hoil problema di riprendere i valori postati.......perchč avavo una
funzione dinamica che li leggeva...ma questa č un'altra storia.
Grazie a tutti!!!!!
e buon lavoro.