- Home
- Categorie
- Coding e Sistemistica
- Coding
- Perche questo codice javascript funziona solo in parte? (HELP!HELP!)
-
Perche questo codice javascript funziona solo in parte? (HELP!HELP!)
Salve a tutti, sono nuovo del forum e questo è il mio primo messaggio.
Ho un DISPERATO bisogno di capire come mai il codice javascript contenuto nel file js collegato alla seguente pagina html, mi funziona solo in parte!
Allora, il seguente è il codice html.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Calcolo dell'età esatta</title>
<script language="JavaScript" type="text/javascript" src="PASSO DUE - 6.js">
</script>
</head>
<body>
<b>PASSO 2 - Es: 6</b><br>
<i>Roberto Cilia</i><br>
Funzione che calcola gli anni esatti di una persona.<br>
<center>
<form action="" name="eta">
<b> - Data di Nascita - </b><br>
gg: <input type="text" name="ggN">
mm: <input type="text" name="mmN">
aaaa: <input type="text" name="aaaaN"><br>
<b> - Data Attuale - </b><br>
gg: <input type="text" name="ggA">
mm: <input type="text" name="mmA">
aaaa: <input type="text" name="aaaaA"><br>
<input type="button" value="calcola" onclick="
calcola (eta.ggN, eta.mmN, eta.aaaaN,
eta.ggA, eta.mmA, eta.aaaaA,
eta.ris);
">
<input type="reset" value="Azzera">
<input type="text" name="ris" readonly="readonly"><br>
</form>
</center>
</body>
</html>
Invece il file PASSO DUE - 6.js dove sono contenuti i comandi javascript è il seguente:
function calcola (gn, mn, an, ga, ma, aa, r){
if ((mn.value = ma.value) &&
(ga.value >= gn.value))
r.value = aa.value -
an.value;if ((mn.value = ma.value) &&
(ga.value < gn.value))
r.value = (aa.value - an.value) -1;}
E questo codice calcola esattamente l'età quando il valore inserito nel campo del mese di nascita è uguale a quello del mese attuale, tenendo conto del valore che si inserisce nel campo dei giorni.
Es: Data di nascita: 4 7 1984
Data attuale 3 7 2007
Anni: 22Il seguente codice allo stesso modo funziona confrontando se il campo del mese di nascita è maggiore o minore del campo del mese attuale.
E SINGOLARMENTE funziona:function calcola (gn, mn, an, ga, ma, aa, r){
if (mn.value < ma.value)
r.value = aa.value -
an.value
else
r.value = (aa.value - an.value) -1;
}
Il problema è che quando unisco le due parti, quest'ultima non funziona più e il programma non funziona ovviamente...
Cosa c'è che non va?Spero qualcuno possa aiutarmi...
-
Ciao Zerph, e benvenuto sul forum GT!
A prima vista mi viene un dubbio, come le unisci le due cose?
Seconda cosa, nel secondo pezzo di codice mi sembra che manchi il punto e virgola dopo:
r.value = aa.value - an.value
-
Ciao Jantima,
dove mi segnali tu, il punto è virgola non l'ho messo perchè c'è la parola riservata ELSE e il comando non finisce dove dici tu ma dopo ELSE.In pratica il comando inizia da IF e sta a significare che:
SE (if) il valore di mn è minore del valore di ma, il valore di r è unguale al valore di aa meno il valore di an.
ALTRIMENTI (else) il valore di r è uguale al valore di aa meno il valore di an, meno 1.
Il mio problema non è che questo comando non funzioni, funziona eccome quindi non è errato.
E funziona anche l'altro pezzetto di codice SINGOLARMENTE che restituisce l'età esatta se il campo del mese di nascita è minore o maggiore del campo del mese attuale.Il prolema (che mi sta snervando perchè tra 10 giorni ho un esame! :() è che il tutto smette di funzionare se unisco nel medesimo file js questi due codici che invece singolarmente fanno ciò che io voglio.
Per risponderti Jantima, i due codici li metto di seguito dentro la funzione calcola, separati da ;
Eviedentemente sta quì l'errore e c'è un modo per legarli insieme e far si che tutte queste condizioni coesitano e pagherei oro per capire quele sia il modo...
Se qualcuno ha voglia di prendere questi codici e provarli in file html e js e mi aiutasse a scoprire il codice esatto finale, gli sarei immensamente grato... di modo da capire la logica, dove sta l'errore
-
Ciao

In Javascript i punti e virgola non sono fondamentali, a differenza di altri linguaggi come ad esempio Java.
L'errore che salta subito all'occhio è l'uso errato dell'operatore uguale, che assegna un valore e invece non effettua un un confronto, per capirci:
if ((mn.value = ma.value) && (ga.value >= gn.value))l'uguale in rosso è un errore, per effettuare i confronti si utilizza ==Senza perder tempo a correggere gli altri errori ti passo il codice completo che sembra funzionare, ma visto è buttato giù al volo ti consiglio di controllarlo.
Ho mantenuto a grandi linee la struttura che avevi creato tu, ma ho eliminato il passaggio di parametri, visto js può leggere direttamente i valori dal form e quindi non bisogna passare i parametri quando si richiama la funzione.
Ora la data attuale si imposta in automatico.
In bocca al lupo per l'esame.Ciao

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Calcolo dell'età esatta</title> <script language="JavaScript" type="text/javascript"> <!-- //<![CDATA[ function calcola () { data(); //calcola quanti anni sono passati trascurando i mesi e i gioni var anni = document.eta.aaaaA.value - document.eta.aaaaN.value; // se il mese di nascita non è ancora arrivato, oppure se è questo il mese di nascita ma il giorno non è ancora arrivato, sottrae 1 al numero di anni if (document.eta.mmN.value > document.eta.mmA.value || (document.eta.mmN.value == document.eta.mmA.value && document.eta.ggN.value > document.eta.ggA.value)) anni = anni - 1; // aggiorna il campo con il risultato document.eta.ris.value = anni; } function data(){ // imposta automaticamente la data attuale prendendola da quella impostata nel pc, la funzione è richiamata nel tag body al caricamento della pagina var data = new Date(); document.eta.ggA.value = data.getDate(); document.eta.mmA.value = data.getMonth(); document.eta.aaaaA.value = data.getFullYear; //ripristina la data attuale in caso di azzeramento o l'aggiorna in caso di cambiamento della data setTimeout('data()', 1000); } //]]> --> </script> </head> <body onload="data();"> <b>PASSO 2 - Es: 6</b><br> <i>Roberto Cilia</i><br> Funzione che calcola gli anni esatti di una persona.<br> <div align="center"> <form action="" name="eta"> <b> - Data di Nascita - </b><br> gg: <input type="text" name="ggN"> mm: <input type="text" name="mmN"> aaaa: <input type="text" name="aaaaN"> <br> <b> - Data Attuale - </b><br> gg: <input type="text" name="ggA" readonly="readonly"> mm: <input type="text" name="mmA" readonly="readonly"> aaaa: <input type="text" name="aaaaA" readonly="readonly"> <br /> <br /> <input type="button" value="calcola" onclick=" calcola(); "> <input type="reset" value="Azzera"> <input type="text" name="ris" readonly="readonly"> </form> </div> </body> </html>
-
Piccola aggiunta... Sarebbe ovviamente necessario fare dei controlli per evitare età negative o cose simili.
Quindi l'ideale sarebbe controllare che tutti i valori siano compresi entro range ben definiti.. quindi ad esempio
0 < ggN < 31
0 < mmN < 13
0 < aaaaN <= document.eta.aaaaA.valueMagari potesti anche usare anzichè le caselle di testo dei select.
Ciao

-
EUREKA!

Il tuo codice sicuramente funziona, ma hai usato le variabili e non sono presenti nell'esame.
Quinidi l'esercizio poteva essere risolto senza le variabili, ed infatti così è stato... si trattava del doppio uguale.Ti ringrazio moltissimo.
Ora però vorrei che al posto dei numeri il codice funzioni anche con delle stringhe, cioè scrivendo (o selezionando) i nomi dei mesi.
Se uso al posto del campo text un tag select e do alle varie opzioni i valori di 1, 2,ecc, pensi che funzioni?
Mmm... adesso provo.
Grazie ancora dell'aiuto.
-
L'unica variabila usata era superflua, puoi benissimo toglierla...
L'avevo messa per un maggior ordine.
Comunque visto funziona usa il tuo codice che sicuramente conoscerai e saprai illustrare meglio.@Zerph said:
Se uso al posto del campo text un tag select e do alle varie opzioni i valori di 1, 2,ecc, pensi che funzioni?
Certo è proprio così che devi fare.
-
Si, funziona! ^___^
Grazie del GRANDE aiuto...P.S: Ho paura vi porro i miei altri (sicuri) dilemmi dopo ogni lezione del mio strampalato Professore...

-
Ciao, guarda la disattenzione è una brutta cosa per chi deve programmare...
Quindi prima di provare a fare qualsiasi cosa, prova a concentrarti...Oprion che sarebbe?
Poi il select va chiuso alla fine con </select>
Prova a sistemare....Edit dopo il tuo edit: Rispondevo senza vedere la tua modifica al messaggio

-
Tramquillo, comunque il tutto funziona anche senza chiudere il select.
E' come sta sulle dispense del professore... (questo ti dovrebbe far capire che elemento sia...) ^__^