Newsgroup: it.comp.lang.javascript
Titolo: Sommare il valore di radiobutton

<!-- Ciao a tutti
premetto che sono moolto scarso in js
vorrei sommare il valore dei radiobox checkati
ho provato con tanti aiuti online
ho provato a scrivere la funzione sottostante
però non funziona
...Aiuto :)
-->
<script language="JavaScript" type="text/JavaScript">
function zamezahl(){
var c,XC;
for(var i=0; i< document.form1.length; i++){
if(document.getElementsByTagName("input")[i].type =='radio'){
 if(document.getElementsByTagName("input")[i].checked==true){
c = parseFloat(document.getElementsByTagName("input")[i].value);
}
}if(c!='NaN'){ XC =c+c;}
}
document.getElementById("tot").innerHTML= XC;
}
</script>
<form name="form1">
<input type="radio" name="gruppe_winner_jpg" value="0.9"
onmouseup="zamezahl()">0.9
<input type="radio" name="gruppe_winner_jpg" value="1.8"
onmouseup="zamezahl()">1.8
<input type="radio" name="gruppe_winner_jpg" value="2.7"
onmouseup="zamezahl()">2.7
<input type="radio" name="gruppe_winner_jpg" value="9.5"
onmouseup="zamezahl()">9.5
<input type="radio" name="gruppe_winner_jpg" value="22.9"
onmouseup="zamezahl()">22.9
<hr>
<input type="radio" name="gruppe_winner1_jpg" value="0.9"
onmouseup="zamezahl()">0.9
<input type="radio" name="gruppe_winner1_jpg" value="1.8"
onmouseup="zamezahl()">1.8
<input type="radio" name="gruppe_winner1_jpg" value="2.7"
onmouseup="zamezahl()">2.7
<input type="radio" name="gruppe_winner1_jpg" value="9.5"
onmouseup="zamezahl()">9.5
<input type="radio" name="gruppe_winner1_jpg" value="22.9"
onmouseup="zamezahl()">22.9
</form>
<span id="tot" color="#0033CC"></span>

 -->
IMHO il tuo approccio non e' corretto, in quanto nel ciclo di somma
consideri tutti gli elementi indistintamente.
Dovresti separare i radio in gruppi e sommare all'accumulatore il valore
del radio selezionato per ciascun gruppo.
Premesso cio', ho rimaneggiato il tuo codice:
<script language="JavaScript" type="text/javascript">
<!--
function sommaRadio(){
   var somma = 0,
      /**
       * Array contenente i gruppi di Radio da sommare.
       * Per aggiungere un altro gruppo ti basta includerlo
       * in questo array
       */
      gruppi = [document.form1.elements['gruppe_winner_jpg'],
                document.form1.elements['gruppe_winner1_jpg']];
   for (var k = 0; k < gruppi.length; k++){      
      for (var i = 0; i < gruppi[k].length; i++){
         if(gruppi[k][i].checked==true) {
            somma += parseFloat(gruppi[k][i].value);
         }
      }
   }
 
   document.getElementById("tot").innerHTML= somma;
}
-->
</script>
<form name="form1">
<input type="radio" name="gruppe_winner_jpg" value="0.9"
onclick="sommaRadio()" />0.9
<input type="radio" name="gruppe_winner_jpg" value="1.8"
onclick="sommaRadio()" />1.8
<hr />
<input type="radio" name="gruppe_winner1_jpg" value="9.5"
onclick="sommaRadio()" />9.5
<input type="radio" name="gruppe_winner1_jpg" value="22.9"
onclick="sommaRadio()" />22.9
</form>
<span id="tot"></span>
-- 
Ho capito che tipo sei, sei uno di quelli che mandano i messaggini
con le k inframezzati da pletore di puntini di sospensione


Si... la funzione č buona il problema č aggiungere i gruppi,
non so' mai quanti sono e nemmeno i loro nomi, perchč vengono generati
server side, ...daccordo posso generare l'array tramite php, non sarebbe un
problema, volevo solo evitare di gestire lo script js tramite server side.

 problema, volevo solo evitare di gestire lo script js tramite server side.
Ho guardato un po` il tuo codice e ti dico che l' approccio non č poi cosě
male
function zamezahl(){
var c = 0; //la variabile va inizializzata
for(var i=0; i< document.form1.length; i++){
if(document.getElementsByTagName("input")[i].type =='radio'){
 if(document.getElementsByTagName("input")[i].checked==true){
//qui avevi fatto un po`di confusione
c +=parseFloat(document.getElementsByTagName("input")[i].value);
}
}
document.getElementById("tot").innerHTML= c.toFixed(2);
//Ho usatto il toFixed per eliminare i numeri troppo lunghi dopo la virgola
//toFixed(2) restituisce 2 decimali, 3 ne restituisce 3, etc...
}
}
nella chiamata dovresti usare l`evento onClick="zamezahl()"
by by

 problema
scusa, ma se lo generi dinamicamente lato server e' ancora piu' facile.
Ti basta aggiungere una riga all'array dei gruppi contenente il nome del
gruppo.
-- 
sign under construction
construction time again

 gruppo.
Si č proprio quello che ho fatto, ...ieri :)
Ho testato anche il codice Laura  ...e funziona benissimo
ormai non cambio piů nulla, mi soddisfa solo il fatto che
tanto fuori strada non ero, inoltre mi ha evitato un' ulteriore
post per fissare i decimali.
...azz a volte sembra che ti leggono nel pensiero :)
Ringrazio entrambi per il prezioso aiuto
Jeey

 //toFixed(2) restituisce 2 decimali, 3 ne restituisce 3, etc...
ottimo
-- 
Erano giorni di Maggio, tra noi si
scherzava a raccogliere ortiche

 //toFixed(2) restituisce 2 decimali, 3 ne restituisce 3, etc...
Consapevole che non funziona con IE<5.5 (e quindi stai escludendo IE5.0)?
-- 
"Emancipate yourselves from mental slavery;
None but ourselves can free our minds"
									    B.M.

 Consapevole che non funziona con IE<5.5 (e quindi stai escludendo IE5.0)?
Come faccio ad arrotondare senza usare il toFixed()

 Come faccio ad arrotondare senza usare il toFixed()
http://groups.google.it/group/it.comp.lang.javascript/msg/6aaa66a6186bb55d?hl=it
-- 
ZER0
~ .. six thousand and forty nine days, seven hours, eighteen minutes, fifty six seconds.
That is when the world ended.

 c +=parseFloat(document.getElementsByTagName("input")[i].value);
Il che è uno spreco immane. Basta recuperare la collection una volta
solamente, invece di interrogare il DOM ogni volta; come abbiamo più volte
visto nel NG:
var els=document.getElementsByTagName("input");
.
.
if (els[i].type=="radio")
etc..
In ogni caso, in casi come questi si può benissimo utilizzare la vecchia e
cara collection elements.
Riscrivendo al volo il codice, dovrebbe apparire più o meno così:
function zamezahl(){
	var c = 0,
		els=document.form1.elements;
 
	for(var i=0; i<els.length; i++)
		c+=(els[i].type =='radio' && els[i].checked)?parseFloat(els[i].value):0;
 
	document.getElementById("tot").innerHTML= c.toFixed(2);
}
Per dover di cronaca, ultima istruzione a parte, questo codice
funzionerebbe anche su browser che non supportano lo standard DOM w3c, come
NS4.x.
P.S.
Spero di non aver fatto qualche castroneria, sono appena reduce da una
Firenze-Milano a tavoletta senza nemmeno una pausa, con sveglia alle sette
e arrivo diretto in ufficio.. :)
-- 
ZER0
~ .. six thousand and forty nine days, seven hours, forty four minutes, fourteen seconds.


 ottimo
Ragazzo, incomincio a pensare che quando vedi un nome femminile il tuo
giudizio ne resti offuscato.. non hai notato gli errori presenti nel codice
di costei.. :)
-- 
ZER0
~ .. six thousand and forty nine days, seven hours, forty five minutes, fifty five seconds.


 }
bene...bene...
ho testato anche questa funzione, in effetti è quella più sintetica, mi
piace
il modo alternativo dell' else if
bravo :)

 il modo alternativo dell' else if
Dicesi "operatore ternario", trovi tutto questo nella reference di
javascript che ti consiglio caldamente di leggere :) 
-- 
ZER0
~ .. six thousand and forty nine days, eight hours, forty five minutes, twenty nine seconds.


 di costei.. :)
la primavera... :)



Ho due manuali, su uno viene menzionato come ciclo
alternativo, sull' altro c' č solo un' esempio,
senza nessuna specificazione,(č per coloro piů avanzati)
infatti li ho aperti entrambi
un paio di volte, perchč in rete trovo le informazioni migliori
ed anche piů ...spiegate...
E' da tanto che cerco un manuale alla mia portata,
ma compro sempre cose sbagliate :(

 ma compro sempre cose sbagliate :(
Non c'è niente di meglio che la reference del linguaggio stesso.
In questo messaggio che ho scritto recentemente puoi trovare qualche
riferimento:
http://groups.google.it/group/it.comp.lang.javascript/msg/eeeb0473cd882eb3?hl=it
-- 
ZER0
~ .. six thousand and forty nine days, nine hours, thirty seven minutes, thirty seven seconds.


 la primavera... :)
Concesso.. ti capisco.. :)
-- 
ZER0
~ .. six thousand and forty nine days, nine hours, fifty five minutes, twenty one seconds.
