- Home
- Categorie
- Coding e Sistemistica
- Javascript & Framework
- 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...) ^__^