• User Newbie

    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: 22

    Il 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...


  • User Attivo

    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


  • User Newbie

    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


  • Super User

    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 :ciauz:

    <!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>
    
    

  • Super User

    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.value

    Magari potesti anche usare anzichè le caselle di testo dei select.

    Ciao:ciauz:


  • User Newbie

    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.


  • Super User

    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.


  • User Newbie

    Si, funziona! ^___^
    Grazie del GRANDE aiuto...

    P.S: Ho paura vi porro i miei altri (sicuri) dilemmi dopo ogni lezione del mio strampalato Professore...

    😛


  • Super User

    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 🙂


  • User Newbie

    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...) ^__^