Newsgroup: it.comp.lang.javascript
Titolo: disabilitare bottone

Ciao,
ho usato questa funzione per evitare più click sullo stesso bottone di 
un form:
function Disabilita(){
oForm=document.forms[0];
oForm.bottoneSalvaDati.disabled=true;
}
solo che in un secondo momento mi sono ricordato che così facendo i dati 
POST non vengono spediti.
C'è un modo per disabilitare il bottone al click inviando comunque i 
dati? Ci sono esempi che posso studiare?

spilato ha scritto:

perché dovresti disabilitarlo? a meno che tu non stia usando
XMLHttpRequest o frames (ma non lo specifichi) quando fai il submit
del form il pulsante e tutta la pagina scomparirebbero perché
viene chiamata la pagina dichiarata nell'action del form stesso.
rae

provato a mettere la chiamata alla funzione dentro
OnSubmit="" del tag <form> ? 

 
forse sarebbe meglio l'evento onblur dato che onsubmit potrebbe 
disabilitarlo prima di richiedere l'action... A occhio e croce, dalla 
mia ignoranza, penso che sia meglio così, no? altrimenti si avrebbero 
due  azioni contrastanti almeno nella logica: INVIA (submit) e 
DISABILITA L'INVIO (onsubmit) con lo stesso click. Che ne pensate?
Cosa viene eseguito prima?
:)

 forse sarebbe meglio l'evento onblur 
scusate è meglio onmouseout dato che onblur funziona solo con i testi 
selezionati.
:)

 selezionati.
votiamo per un
 function MandaEBlocca() {
    document.oForm.submit();
    document.oForm.bottoneSalvaDati.disabled=true;
}
???
speriamo bene ! :) 

 del form il pulsante e tutta la pagina scomparirebbero 
non č sempre cosě: a volte, per varie cause, questo non accade 
immediatamente e l'utente impaziente clicca piů volte

 speriamo bene ! :) 
senza nulla togliere alla funzione votata, in giornata ho pensato questo 
: al secondo click si blocca il bottone. L'unica cosa è che non riesco a 
rendere davvero globale la variabile e il conto rimane a 1, mentre io 
vorrei che arrivasse a 2. Come si fa? Che ve ne pare dell'idea? Di 
fatto, la mia intenzione sarebbe quella di far partire la prima 
richiesta e di bloccare la seconda.
<html>
<head>
<title>Prova blocco del tasto con variabile globale</title>
<script language='javascript' type='text/javascript'>
iCount = 0;
</script>
<script language='javascript' type='text/javascript'>
function addClick(){
iCount++;
return iCount;
}
</script>
<script language='javascript' type='text/javascript'>
function disableBtn(){
var oForm = document.forms[0];
iClicks = addClick();
if(iClicks>=2){oForm.bottoneSalvaDati.disabled = true;}
}
</script>
</head>
<body>
<form method='get' action=''>
<button name='bottoneSalvaDati' onClick='disableBtn();' value='submit' 
type='submit'/>Inserisci</button>
</form>
</body>
</html>

 POST non vengono spediti.
In che senso, scusa? Il pulsante lo disabiliti DOPO che il segnale di invio
form è stato ricevuto, in modo da evitare un secondo click. Quindi i dati
vengono inviati eccome. L'unico campo che non viene inviato al server, è il
bottone stesso (in quanto disabilitato) ma solo quello.
-- 
~ La realtà è un'illusione causata dall'assenza di alcool.

 bottone stesso (in quanto disabilitato) ma solo quello.
ZER0, scusa, non ho capito   :-(

 ZER0, scusa, non ho capito   :-(
Allora. Il nocciolo del discorso è che vuoi evitare che l'utente invii più
volte la stessa form con gli stessi dati cliccando selvaggiamente sul tasto
di submit. Per ottenere questo risultato, va benissimo quel che avevi
pensato all'inizio, ovvero disabiliti il pulsante di submit. Tu dici che ti
sei ricordato che così facendo i dati della form non vengono spediti, ma non
è così. L'unico dato non inviato è il pulsante che hai disabilitato, e
basta.
Spero di essere stato più chiaro, adesso.
-- 
~ Io non soffro di pazzia, ne godo ogni minuto.
(I don't suffer from insanity, I enjoy every minute of it)

 Spero di essere stato piů chiaro, adesso.
Sei chiarissimo ma, oltre ad averlo ricordato, l'ho anche sperimentato 
(credo) e poi letto (ri-credo). Cioč: il form non invia alcunché al 
server (la pagina "freeza" il bottone e si blocca) e poi qui 
($qui="Professional JavaScript for web developers, pag. 342, N. Zakas, 
Wrox"):
"You may be wondering why you can't just use a Submit button and disable 
it using onclick. The answer is that the button actually disables before 
the form is submitted, which then prevents the form from being submitted 
at all"
per cui lui fa questa cosa che a me non piace tanto:
onclick='this.disabled = true; this.form.submit()'
Proprio per questo avevo pensato (come avrai visto dai post precedenti) 
di implementare un contatore globale, cosa che non mi č riuscita ma non 
so perché. Cioč, al primo click iCount č 1 e non succede nulla (i dati 
cominciano a inviarsi) al secondo si blocca (e non si invia piů nulla).
Anche lě, come dicevo, non sono riuscito ad andare avanti. Grazie per la 
pazienza.   :-)

 pazienza.   :-)
De nada.


 proposta dall'autore del libro, eh. :)
mi pareva un po' piů pulita.
Mica mi potresti dire perché non si incrementa quella variabile? Cioč, 
per quale motiva non va mai a 2? Credevo che trattandola come variabile 
"di classe" avrei potuto incrementarla tramite un metodo apposito ma non 
ci sono riuscito. Come si potrebbe fare?

 Come si potrebbe fare?
Javascript su browser ha come scope la pagina. Nel momento in cui viene
"distrutta" (ricaricata, abbandonata), le variabili fanno la stessa fine.
A livello crossbrowser, se desideri mantenere un valore nonostante la
distruzione delle pagine, devi utilizzare un cookie.
-- 
~ "E' bello essere vivi. Ci sono tante cose che non si possono fare
da morti."

 distruzione delle pagine, devi utilizzare un cookie.
oggi, mentre cercavo una soluzione, ho letto una cosa riguardo i campi 
hidden, e cioč - se non ho capito male - che si potrebbe incrementare un 
valore contenuto in un campo hidden. Non so: č mai possibile che il 
valore di una variabile vada per forza di cose 'stampato' per essere 
incrementabile? Sto dicendo una o piů sciocchezze?

 incrementabile? Sto dicendo una o più sciocchezze?
Citando Rat-Man: "Brakko, stai dicendo delle sciocchezze. Ma io ti perdono.
Va' e non peccare più." :)


 Va' e non peccare più." :)
beh, la domanda più cretina è quella che non si fa. Ma io cercherò di 
peccare meno   :-)   (meno che posso, voglio dire)   :-)))

 peccare meno   :-)   (meno che posso, voglio dire)   :-)))
Va' tranquillo. :)
-- 
~ Non sono disordinato. Sono solo un massimizzatore di entropia.

 Va' tranquillo. :)
:-)  GRAZIE	

 variabile. 
Non è che, come ti ho detto all'inizio, ricarichi la pagina e quindi viene
tutto distrutto e inizializzato nuovamente?
<html>
<head>
	<title>v.globale</title>
	<script type="text/javascript">
		var globalCounter = 0;
	</script>
</head>
<body>
	<a href="javascript:void(globalCounter++)">Incrementa</a>
	<a href="javascript:void(alert(globalCounter))">Visualizza</a>
</body>
</html>
-- 
~ "Il debito pubblico è abbastanza grande da badare a sé stesso."
(Ronald Regan)

 tutto distrutto e inizializzato nuovamente?
ma il click sull'ok del box dell'alert ricarica la pagina?

spilato ha scritto:

ho provato il tuo esempio:
a me succedeva questo: controllavo l'evento sull'onclick del form.
Forse in quel caso parte un evento submit e all'ok sull'alert è come se 
ci si trovasse in una pagina ricaricata.

spilato ha scritto:
[...]
Perchè non usi una variabile che imposti a true e poi con la funzione la 
imposti a false dopo il submit,
inviato = true
function invia() {
	[comando di invio]
	inviato = false
	}
function disabilita() {
	if (!inviato) button.disabled = true
	 }
e poi la prima la associ a onsubmit e la seconda a onmouseout
Ciao :)

 ma il click sull'ok del box dell'alert ricarica la pagina?
No. Ma se l'alert č una conseguenza del click su un pulsante di submit, una
volta chiuso (ovvero che hai cliccato sull'ok) viene eseguita l'azione di
default del pulsante cliccato che, nel tuo caso, č il submit della form.
-- 
~ "When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)

 ci si trovasse in una pagina ricaricata.
Nono.. ti stai solo confondendo le idee. Guarda il post che ti ho appena
scritto, dovrebbe risultarti tutto più chiaro.
E non è "come se ci si trovasse in una pagina ricaricata", la pagina viene
proprio ricaricata (questo perché manca un'action nel form, o perché punta a
sé stessa. Se nell'action metti una pagina diversa, vedrai che non
ricaricherà la pagina ma invierà ovviamente i dati a quest'ultima).
-- 
~ Ci sono tre modi di fare le cose.
Giuste, sbagliate e come dico io. (Robert De Niro in "Casinò")

 
va bene, grazie di tutto   :-)