Newsgroup: it.comp.lang.javascript
Titolo: Controllo form ed alert con "for"

Salve a tutto il NG
Ho realizzato il seguente script che esegue un controllo su 5 caselle di
testo per vedere se i valori inseriti sono numerici o meno
<script language="JavaScript">
function RispostaNumericaValida(nr_entries)
{
 var frm=document.forms[0];
 for(var i=1;i<=nr_entries;i++)
  if(isNaN(frm['Numero' + i].value))
   alert('Il valore inserito non è un numero!');
  else
  document.form15.submit();
}
</script>
.................... omissis...................
<form name="form15" action="Domanda16.asp">
................... omissis ..................
<TD align=right width="10%"> <a
href="javascript:RispostaNumericaValida(5);"> <font color="#00009C" size="1"
face="VERDANA,ARIAL">
          <img  src="immagini/avanti.gif" border="0" width="35"
height="35"></font></a>&nbsp;
        </td>
Il problema é che quando richiamo la funzione questa controlla il primo
valore e se non é numerico mi compare l'alert ma poi in ogni caso quando do'
l'ok all'alert mi esegue il submit del form.
Penso che sia dovuto al fatto che dopo aver controllato il valore del primo
campo testo mi controlla il secondo e visto che é vuoto o che ha un valore
numerico esegue il document.form15.submit();.
Come posso fare in modo che se trova un solo campo non numerico mi dà
l'alert e mi interrompe il proesguimento dello script?
NB ho notato che se metto 5 valori non numerici mi dà 5 alert e poi rimane
sulla stessa pagina mentre se ad es do 4 valori non numerici ed uno numerico
mi dà per 4 volte la finestra di alert e poi mi esegue il
document.form15.submit();
Grazie in anticipo
Michele


Inizializzi una variabile "non_numerico" prima del ciclo a false;
Nel ciclo, al posto di visualizzare l'alert setti "non_numerico" a true e
togli l'else;
Fuori dal ciclo (dopo) controlli il valore della variabile:
se true allora fai l'alert
altrimenti fai il submit.
Cosi' potrebbe andare?
Ciao,
Ema

         </td>
e' meglio che usi l'altro approcio (anche in futuro):
<a href="#" onClick="RispostaNumericaValida(5);retun false;">....

         </td>
Ti converrebbe mettere il tutto nell'onSubmit del form:
<form name="form15" action="Domanda16.asp" onsubmit="return 
RispostaNumericaValida(5,this)">
In questo modo, indipendentemente da come esegui il submit (tramite 
input type="submit" o href="javascript:document.forms[0].submit()" o 
quel che ti pare) scateni la funzione, che cambia di conseguenza:
function RispostaNumericaValida(nr_entries,frm){
	for(var i=1;i<=nr_entries;i++)
		if(isNaN(frm['Numero' + i].value)){
		alert("Il valore inserito nel campo 'Numero"+i+"' non è un 
numero!\nInserire un nuovo valore.");
		frm["Numero"+i].focus();
		return false;
	}else{
		return true;
	}
}
Volendo si puo' anche automatizzare il recupero di nr_entries, ma non 
vorrei metterti troppa carne al fuoco.
Ricordati di "riallineare" le stringhe. Questa e' un eventuale "prima 
ristesura" del codice, in questo modo appena trova un campo con un 
valore non valido avverte l'utente, sposta il cursore su quel campo, e 
blocca l'invio dei dati.
Volendo potresti anche usare una stringa per "accodare" quali campi non 
sono validi, se ve n'e' piu' d'uno.
-- 
C'ya,
ZER0
  :. job profile - coder.gfxer.webDesigner
"When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)

 }
[Michele request]
"[...] Come posso fare in modo che se trova un solo campo non numerico mi dà
l'alert e mi interrompe il proesguimento dello script?"
Quindi non ti sembra un po' *mostruoso* quel
}else{
return true;
???
Non ti incazz...

 Non ti incazz...
E perche' mai? Sarebbe stato piu' utile, pero', se avessi indicato a 
livello di codice il problema. Non tanto per me, ma per Michele. :)


Ciao ed innanzitutto grazie e grazie anche aglia ltri che mi hanno risposto
ho utilizzato il tuo codice ma capita un evento strano nel senso che se
inserisco valori numerici mi compare una finestra bianca con la scritta true
altrimenti la scritta é false
come faccio per evitare cio??
grazie ancora
¨Michele


 come faccio per evitare cio??
Hai implementato la funzione dell'evento "onsubmit", come ti ho detto, 
specificando il "return RispostaNumericaValida(5,this)" ?
E com'e' che attivi il submit del form? tramite link o bottone?
Buttaci un po' del codice attuale della tua pagina e vediamo dove sta la 
fregatura. :)


 livello di codice il problema. Non tanto per me, ma per Michele. :)
Giusto, infatti si e' appena lamentato, non capendoci il verso... anzi pure
io non capisco cosa gli accade...pensaci tu!
Tornando a noi, non tenere conto di questo post, cioe' non voleva esserci un
tono straffotente e solo che essendo io SuperPermaloso ed essendo stato una
volta "aggredito" per aver fatto una cosa simile alla tua (rimanendo nel
percorso logico del richiedente), ho voluto prendermi una specie rivincita
:)
Rimanendo assolutamente conscio del divario esistente...

 livello di codice il problema. Non tanto per me, ma per Michele. :)
Giusto, infatti si e' appena lamentato, non capendoci il verso... anzi pure
io non capisco cosa gli accade...pensaci tu!
Tornando a noi, non tenere conto di questo post, cioe' non voleva esserci un
tono strafottente e solo che essendo io SuperPermaloso ed essendo stato una


 fregatura. :)
ok allora:
<script language="JavaScript">
<!--
function RispostaNumericaValida(nr_entries,frm){
var frm=document.forms[0]; (questo lo ho aggiunto io penso sia necessario o
no?)
for(var i=1;i<=nr_entries;i++)
if(isNaN(frm['Numero' + i].value)){
alert("Il valore inserito nel campo 'Numero"+i+"' non è un numero!\nInserire
un nuovo valore.");
frm["Numero"+i].focus();
return false;
}
return true;
}
//-->
</script>
............ OMISSIS ............
<form name="form15" action="Domanda16.asp" onsubmit="return
RispostaNumericaValida(5,this)">
............ OMISSIS ............
<TD align=right width="10%"> <a
href="javascript:RispostaNumericaValida(5);"> <font color="#00009C" size="1"
face="VERDANA,ARIAL">
          <img  src="immagini/avanti.gif" border="0" width="35"
height="35"></font></a>&nbsp;
        </td>
questo é tutto
Grazie ancora
michele

 Rimanendo assolutamente conscio del divario esistente...
Guarda, non e' un discorso di "divario" esistente o meno.. gia' piu' di 
una volta - non solo con me, intendo - hai avuto atteggiamenti del tutto 
poco cortesi verso gli altri utenti del forum, sia con i newbie che con 
gli "anziani" o "anzianotti".. senza voler fare ora riferimenti 
specifici per riesumare altri post.
Cerca di cambiare atteggiamento. Lo dico per il tuo bene, perche' la 
"l'etichetta" in rete e' importante quanto la conoscenza della materia, 
se non di piu'.
C'e' modo e modo di dire le cose, e spesso tu scegli il peggiore, quello 
che tende a scatenare i cosiddetti flames.
Alla lunga gli utenti potrebbero anche stancarsi.


 href="javascript:RispostaNumericaValida(5);"> <font color="#00009C"
Eccolo!
ZER0 te lo aveva detto: href="javascript:document.forms[0].submit()"
Quindi:
<a href="javascript:document.forms[0].submit()"> <font ...
op
<a href="#" onClick="document.forms[0].submit()">...

 href="javascript:RispostaNumericaValida(5);"> 
Eccolo la'. Te l'avevo anche detto :) Se non usi un 
type=submit/type=image, come ad esempio:
<TD align=right width="10%">
	<input type="image" src="immagini/avanti.gif" />
</td>
(cliccando su di esso te lo prende come un submit della form, se non 
ricordo male)
ma continui ad usare l'href, esso DEVE cambiare di conseguenza:
<a href="javascript:document.forms[0].submit();">quello che ti pare</a>
oppure:
<a href="#" onclick="document.forms[0].submit();return false;">quello 
che ti pare</a>
In sintesi, non chiami piu' direttamente la tua funzione di check, ma 
essa viene chiamata AUTOMATICAMENTE quando il form viene submittato, in 
qualsiasi modo il submit avvenga.


 Alla lunga gli utenti potrebbero anche stancarsi.
Ho capito, pero' non generalizziamo troppo :(

 Ho capito, pero' non generalizziamo troppo :(
E' solo un suggerimento, prima che tu possa effettivamente entrare nei 
casini, o peggio, portare flames sul newsgroup. Come si sul dire, "uomo 
avvisato mezzo salvato".. E spesso s'intende anche "salvato da se' 
stesso" :)


Ragazzi grazie ancora ma non funziona vi posto il codice esatto:
</script>
<script language="JavaScript">
<!--
function RispostaNumericaValida(nr_entries,frm){
for(var i=1;i<=nr_entries;i++)
if(isNaN(frm['Numero' + i].value)){
alert("Il valore inserito nel campo 'Numero"+i+"' non è un numero!\nInserire
un nuovo valore.");
frm["Numero"+i].focus();
return false;
}
return true;
}
//-->
</script>
............. OMISSIS ..................
<form name="form15" action="Domanda16.asp" onsubmit="return
RispostaNumericaValida(5,this)">
............. OMISSIS ...................
 <TD align=right width="10%"> <a
href="javascript:document.forms[0].submit();"> <font color="#00009C"
size="1" face="VERDANA,ARIAL">
          <img  src="immagini/avanti.gif" border="0" width="35"
height="35"></font></a>&nbsp;
        </td>
Il problema é che é come se non eseguisse la function nel senso che mi fa
passare alla domanda successiva in ogni caso con testo numerico o letterale
o campo vuoto
Grazie ancora e scusate il disturbo
Michele

 Ragazzi grazie ancora ma non funziona vi posto il codice esatto:
Evidentemente, richiamare il metodo submit() da un link non scatena l'evento
onSubmit del form.
Hai almeno due possibilita':
1) Sostituire il link che richiama il metodo submit() con un <input
type=submit ...> o un <input type=image ...>
2) Richiamare dal link la funzione RispostaNumericaValida(...) e all'interno
di questa fare il submit()
Ciao,
Ema

 Michele
Cmq ancora non capisco come il submit() non scateni l'evento "onsubmit". 
Sarebbe come se il focus() non invocasse l'evento onfocus.


 Sarebbe come se il focus() non invocasse l'evento onfocus.
Eppure confermo...io per validare le form metto sempre un onsubmit='return
false'; poi un bel tasto che chiama una function, fai i suoi controllini e,
se tutto ok, esegue il submit()....da lì mi sono chiesto: non dovrebbe
funzionare: se esegue il submit rieseguirà l'onsubmit che restituisce falso
e non fa nulla!
Da quel che ho dedotto esegue onsubmit se esegui il submit da un tasto
submit, non tramite javascript