Newsgroup: it.comp.lang.javascript
Titolo: Evento onKeyUp su un intero form

Ciao a tutti,
sto cercando di far partire una funzione premendo invio mentre mi trovo
all'interno di un form; ho scritto una cosa del genere
function prova(evt){
	if(evt.keyCode==13) verifica_dati();
}
(13 è il codice del tasto invio) e pensavo di lanciarla con
<form onKeyUp="prova(event)" ...
ma funziona solo su IE, mentre Firefox non mi fila proprio. Ho anche
provato a scrivere
document.forms['nomeform'].onKeyUp=prova(event);
dopo la dichiarazione della funzione, ma mi dice che event non è
definito. Dove sbaglio? Grazie per qualsiasi aiuto,
Bluto

 ma funziona solo su IE, mentre Firefox non mi fila proprio. 
Questo dovrebbe spiegarti il perché:
 
http://www.criosoftware.it/default16.aspx
-- 
"Ho smesso di fumare.
 Vivrò una settimana di più.
 E in quella settimana pioverà a dirotto"
									    W.A.

Intendi dire perché IE e Firefox gestiscono in modo diverso l'evento?
var target=evt.target||evt.srcElement;
Ma utilizzando allo stesso modo evt.keyCode in una altra funzione non
ho problemi tra i due browser, con la differenza che nell'altro caso la
funzione è lanciata sul body e non su un form.
Inoltre se anche scrivo
<form onKeyUp="test()"..
dove test() fa un semplice alert, non ottengo risultati, per cui
pensavo che il problema fosse legato proprio all'evento onKeyUp in
combinazione con un form... poi se non ho capito nulla dimmelo pure!

 <form onKeyUp="test()"..
onkeyup (minuscolo). il tag form lo supporta (e quindi anche i Gecko
dovrebbero supportarlo)
 
http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.3
-- 
"Emancipate yourselves from mental slavery;
None but ourselves can free our minds"
									    B.M.

 stranissimo (anzi, assurdo) (anzi, ha un esempio online di questa cosa?)
non ho un esempio online perché si tratta di una intranet, ma ricopio
qui sotto il codice completo di un popup con una serie di checkbox (tra
l'altro l'avevo completato proprio grazie ad alcuni suggerimenti
ricevuti su questo NG); i checkbox rappresentano le lettere
dell'alfabeto, quindi ho fatto in moo che premendo le lettere si
selezionassero o deselezionassero i rispettivi checkbox, mentre con tab
o invio si ottiene il submit del form
<html>
<head>
<title></title>
<link rel=stylesheet href="fissi/style.css" type="text/css">
<script language="javascript">
<!--
function resta(){
	window.focus();
}
function sel(evt){
	alfabeto = new Array();
	for(i=65;i<=90;i++)
		alfabeto[i]=String.fromCharCode(i);
	alfabeto[13] = "INVIA";		// invio
	//alfabeto[32] = "INVIA";		// barra
	alfabeto[9]  = "INVIA";		// tab
	var lett = alfabeto[evt.keyCode];
	if(lett!=undefined) {
		if(lett=="INVIA") {
			document.emp_qual.submit();
		} else {
			var chk = eval('document.emp_qual.' + lett + '.checked');
			if(chk==true) eval('document.emp_qual.' + lett + '.checked=false;');
			else if(chk==false) eval('document.emp_qual.' + lett
+'.checked=true;');
		}
	}
}
//-->
</script>
</head>
<body style="margin:0px;" onLoad="timerID=setInterval('resta()', 100);"
onKeyUp="sel(event)">
<table border=0 align=center>
	<tr bgcolor=#f6db60>
		<td colspan=4 align=center><b>Seleziona le qualifiche</b></td>
	</tr>
	<form name="emp_qual" method=post
action="popup.php?f=wemp&pag=emp_qual">
	<tr height=24><td width=60><input type=checkbox name=A> A </td><td
width=60><input type=checkbox name=H> H</td><td width=60><input
type=checkbox name=O> O</td><td width=60><input type=checkbox name=V>
V</td></tr><tr height=24><td width=60><input type=checkbox name=B> B
</td><td width=60><input type=checkbox name=I> I</td><td
width=60><input type=checkbox name=P> P</td><td width=60><input
type=checkbox name=W> W</td></tr><tr height=24><td width=60><input
type=checkbox name=C> C </td><td width=60><input type=checkbox name=J>
J</td><td width=60><input type=checkbox name=Q> Q</td><td
width=60><input type=checkbox name=X> X</td></tr><tr height=24><td
width=60><input type=checkbox name=D> D </td><td width=60><input
type=checkbox name=K> K</td><td width=60><input type=checkbox name=R>
R</td><td width=60><input type=checkbox name=Y> Y</td></tr><tr
height=24><td width=60><input type=checkbox name=E> E </td><td
width=60><input type=checkbox name=L> L</td><td width=60><input
type=checkbox name=S> S</td><td width=60><input type=checkbox name=Z>
Z</td></tr><tr height=24><td width=60><input type=checkbox name=F> F
</td><td width=60><input type=checkbox name=M> M</td><td
width=60><input type=checkbox name=T> T</td></tr><tr height=24><td
width=60><input type=checkbox name=G> G </td><td width=60><input
type=checkbox name=N> N</td><td width=60><input type=checkbox name=U>
U</td></tr>	<tr>
		<td colspan=4 align=center><input type=submit value=Salva><input
type=hidden name=salva value=Salva></td>
	</tr>
	</form>
</table>
<div align=center style="font-size: smaller">utilizza le lettere della
tastiera per selezionare le qualifiche, Tab o Invio per
proseguire</div></body>
</html>
se provi a fare il copia e incolla in una pagina html vedrai che
funziona sia con IE che FF; per questo (in un'altra pagina) ho cercato
di replicarne in parte il funzionamento, per fare in modo che alla
pressione del tasto invio il form sia inviato come se ci fosse un
pulsante submit.
Purtroppo però con FF non riesco a far funzionare nulla con onkeyup su
tag form; ho provato anche a scrivere tutto in minuscolo, ho provato a
fargli fare solo un semplice alert senza chiamare in nessun modo event,
ma non va! :(
Hai qualche suggerimento? Io pensavo di collegare l'evento al form per
non doverlo associare ad ogni tag input che lo compone (17 campi!), ma
al limite preferisco così piuttosto che rinunciare a scrivere qualcosa
di valido anche per Firefox.
Ciao,
Bluto
PS: non mi martoriare per gli eval, appena ho tempo li sostituisco!!!
:)

 	if(lett!=undefined) {
eh grazie ... hai fatto un alert(lett!=undefined) in firefox? stai saltando
tutta questa parte, per forza non ti segnala errore!
Comunque sia onkeyup="alert('ok')" a me funziona correttamente (firefox
1.5), mentre il tuo event è undefined in browser Gecko.
 
http://www.criosoftware.it/bak/onKeyUpForm.htm
 
-- 
"Voi abili a tenere sempre un piede qua e uno là
 avrete un avvenire certo in questo mondo qua
 però la dignità
 dove l'avete persa?"
									    V.R.

 1.5), mentre il tuo event è undefined in browser Gecko.
Non so che dirti, in effetti il tuo esempio funziona anche a me
(anch'io ho Firefox 1.5); il fatto è che ci sono già alcuni gestori
di eventi sui campi del mio form (onFocus, onBlur e su alcuni anche
onClick), ma sul body e sul tag form non c'è nulla, quindi non capisco
perché dovrebbero esserci dei problemi (tanto più che su IE funziona)
Vabbeh, adesso ricontrollo - per l'ennesima volta! :-/

 Scusami ma non ho capito cosa sto saltando; 
metti un alert("ok") subito dopo l'if, vedrai che i browser Gecko lo
saltano...vero che è l'array, ma lo assegni come 
 	var lett = alfabeto[evt.keyCode];
e, per firefox, è un oggetto undefined ...
-- 
"Ti sei salvato
 o sei entrato in banca pure tu?"
									    A.V.

Scusa, oggi forse sono più rintronato del solito, ma a me gli alert
messi così li prende perfettamente sia IE che Firefox:
function sel(evt){
	alfabeto = new Array();
	for(i=65;i<=90;i++)
		alfabeto[i]=String.fromCharCode(i);
	alfabeto[13] = "INVIA";		// invio
	//alfabeto[32] = "INVIA";		// barra
	alfabeto[9]  = "INVIA";		// tab
	var lett = alfabeto[evt.keyCode];
	if(lett!=undefined) {
		alert(lett);
		if(lett=="INVIA") {
			document.emp_qual.submit();
		} else {
			var chk = eval('document.emp_qual.' + lett + '.checked');
			if(chk==true) eval('document.emp_qual.' + lett + '.checked=false;');
			else if(chk==false) eval('document.emp_qual.' + lett
+'.checked=true;');
		}
	} else {
		alert('ko!');
	}
}
dov'è che dovrebbero diventare undefined? Del resto la funzione va
come dovrebbe, cioè alla pressione del tasto Z seleziona il checkbox
Z.
Ripeto, oggi sono sicuramente rintronato dal poco sonno (mannaggia a
me), ma proprio non capisco quale dovrebbe essere il problema;
perdonami per l'insistenza, ma sono un niubbo curioso! :)

 messi così li prende perfettamente sia IE che Firefox:
[CUT]
No, scusa te, sono io che leggo di corsa e ogni tanto fallo ... stai
chiamando la function come
 onKeyUp="sel(event)"
e quindi stai passando correttamente l'oggetto event.
Quindi il problema non sussiste: devi passare l'oggetto event (e lo stai
passando), e onkeyup sulla form funziona perfettamente. Ergo c'è
qualcos'altro che non va nella tua pagina.


> c'è qualcos'altro che non va nella tua pagina.
già, e visto che ogni campo ha almeno due funzioni su onfocus, una o
due su onblur nonché qualcosa su onclick e onselect adesso vai a
capire cos'è che fa tutto l'impiccio! :-/ Mi sa che ci rinuncio e chi
vorrà mandare il form continuerà a farlo premendo il pulsante
"Salva"! ^_^ Evviva le cose fatte alla buona vecchia maniera! :D
Ciao e grazie,
Bluto
PS: a (s)proposito, tramite javascript c'è il modo di bloccare il
submit di un form? Voglio dire, tutto il mio problema nasce perché per
validare alcuni campi del form ho tolto il clasico pulsante submit e
l'ho sostituito con un button a cui ho associato la funzione di
controllo e (se tutto va bene) il conseguente invio del form.
Ovviamente in questo modo se premo invio mentre scrivo sul form, questo
non viene inviato. Ma se invece mettessi il pulsante submit e volessi
chiamare la funzione di controllo con onsubmit, nel caso il contenuto
del form non andasse bene c'è un modo per bloccare l'invio dei dati
senza ricaricare la pagina? Se ci fosse un modo avrei risolto tutti i
miei problemi (escluso bollette e fame nel mondo!)

 senza ricaricare la pagina?
Il javascript nasce cresce e si riproduce praticamente solo per
questo :-)
 function ValidaForm(f) {
   if (il contenuto del primo campo NON è ok) {
   alert("condizione non soddisfatta");
   return false;
   }
   // ripetere controlli ad libitum
  return true;
 }
<form onsubmit="return ValidaForm(this)">
P.S. Non dimenticare lo stesso tipo di controllo sul server; quello
appena visto mira solo ad agevolare l'utenza, a te occorrono _garanzie_.
-- 
mailto: y = i
----------------------------------------
Vivo nel terrore di non essere frainteso 
(Oscar Wilde)

sì, anch'io ho cominciato a usare js per validare i form (salvo
ripetere i controlli lato server ovviamente), ma la funzione che
utilizzavo non veniva richiamata dall'onsubmit del form perché
ignoravo che si potesse utilizzare 'return validaform' per bloccarne
l'invio! 
Grazie a tutti delle info,
Bluto