Avatar billede Morten Nybegynder
26. februar 2007 - 14:14 Der er 17 kommentarer og
1 løsning

dato + måned

Hej

Jeg kan intet javascripting så jeg skal bruge lidt hjælpe:

Jeg har 3 form felter: dags_dato - dato - måned

Det jeg ønsker er at:

hvis dato udfyldes så skal den beregne antal måneder (dato-dags_dato)

hvis måned udfyldes så skal den beregne en dato (dags_dato+måned)

Den skal lave beregning når feltet forlades.
Sciptet må ikke beregne hvis der er indtastet i begge felter.

Håber nogen kan hjælpe mig

Morten
Avatar billede Morten Nybegynder
26. februar 2007 - 14:22 #1
Glem "Scriptet må ikke beregne hvis....."
Avatar billede roenving Novice
27. februar 2007 - 01:06 #2
Du skal vist lige give lidt mere oplysning ...

-- f.eks. om det er indtastning eller select-bokse, og om hvornår det kan være relevant/muligt at udfylde flere felter ...

-- hrm, jeg tror jeg kunne finde flere spørgsmål frem, så måske en idë om din foreliggende kode og formålet (f.eks. et link !-) ville fremme processen !o]
Avatar billede crazysnap Seniormester
27. februar 2007 - 01:22 #3
Hej cddk,

Nu har jeg kigget lidt på det og bikset et eksempel sammen (nendenfor). Er det noget lignende sådan en løsning du søger? Hvis du ud fra løsningen skriver hvad du mangler eller hvad der skal ændres, så har vi noget at gå ud fra! :)


<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <script type="text/JavaScript">
       
        var outputId = "output";
        var dateNow;
        var oneMonth = 1000*60*60*24*31;
       
        function intializeDateNow(tbId)
        {
            dateNow = new Date();
           
            writeDate(tbId, dateNow);         
        }
       
        function writeOutput(msg)
        {
            document.getElementById(outputId).value = msg;
        }
       
        function writeDate(tbId, date)
        {
            var days = date.getDate();
            var month = date.getMonth();
            var years = date.getFullYear();
           
            document.getElementById(tbId).value = days.toString() + "-" + month.toString() + "-" + years.toString();
        }
       
        function calculateMonths(elmDate, monthId)
        {
            writeOutput("");
           
            var arrDate = elmDate.value.split("-");
           
            if(arrDate.length != 3 || arrDate[2].length != 4)
            {
                return;
            }
           
            var strDay = arrDate[0];
            var strMonth = arrDate[1];
            var strYear = arrDate[2];
           
            var tmpDate = new Date(strYear, strMonth, strDay);
         
            if( isNaN(tmpDate) )
            {
                writeOutput("'Dato' field must be of form:    dd-mm-yyyy");
                elmDate.focus();
                return;
            }
         
            if(tmpDate < dateNow)
            {
                writeOutput("'Dato' skal være senere en Dags dato");
                elmDate.focus();
                return;
            }
           
            var newDate = Math.ceil((tmpDate.getTime() - dateNow.getTime())/oneMonth);
            document.getElementById(monthId).value =newDate;
        }
       
        function calculateDate(elmDate, dateId)
        {
            writeOutput("");
           
            if(elmDate.value == "")
                return;
           
            var months = parseInt(elmDate.value);
           
            if( isNaN(months) || months < 0)
                writeOutput("Måneder skal være en heltalsværdi større en 0.");

            var date = new Date(dateNow.toGMTString());
            var newDate = new Date(date.getYear(), date.getMonth() + months, date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds());
            writeDate(dateId, newDate);
        }

       
        </script>
    </head>
    <body onload="intializeDateNow('datenow');">
        <table>
            <tr>
                <td style="width: 100px;">Dags dato:</td>
                <td><input id="datenow" type="text" readonly="readonly" /></td>
            </tr>
            <tr>
                <td>Dato:</td>
                <td><input id="date" type="text" onkeyup="calculateMonths(this, 'month');" /></td>
            </tr>
            <tr>
                <td>Måneder:</td>
                <td><input id="month" type="text" onkeyup="calculateDate(this, 'date')" /></td>
            </tr>
            <tr>
                <td>Output:</td>
                <td><input id="output" readonly="readonly" type="text" style="width: 600px; border: 0; color: Red;" /></td>
            </tr>
        </table>
    </body>
</html>



Mvh.

- Snap :)
Avatar billede Morten Nybegynder
27. februar 2007 - 01:35 #4
Okay - bedre forklaring (forsøg derpå):

Hmmmm... altså tre felter som nævnt [Dags_dato] - [Antal_måneder] - [Udløbs_dato]

[Dags_dato] er altid... dags dato

Hvis der ændres i [Antal_måneder] skal [Udløbs_dato]=[Dags_dato]+[Antal_måneder]
Hvis der ændres i [Udløbs_dato] skal [Antal_måneder]=[Udløbs_dato]-[Dags_dato]

Alle tre bokse er indtastningsbokse (<input type="text" />)
Var det mere forståligt?
Avatar billede Morten Nybegynder
27. februar 2007 - 01:36 #5
>>Snap - er det hvad din kode gør?
Avatar billede crazysnap Seniormester
27. februar 2007 - 01:45 #6
Ja, det skulle være det mit script gør.

Du kan jo prøve at kopiere det over i en ny html fil og se ad. :)


- Snap
Avatar billede Morten Nybegynder
27. februar 2007 - 09:00 #7
Jooo - det virker næsten... som jeg ønsker det men:

Dags dato er forkert - skriver 27-1-2007?

Når jeg skriver i Dato så ændre måneder sig fint, men når jeg så hopper til måneder så skifter den måneder og Dato ændre sig så, den skulle gerne holde fast?

Hvordan formateres datoen til dd-mm-yyyy ?
Avatar billede crazysnap Seniormester
27. februar 2007 - 09:31 #8
Hej cddk, :)


- Jeg havde lige glemt at ligge 1 til måneder hvilket man skal hvis man bruger getMonth() på et Date objekt (derfor den gale måned i dags dato).

- Jeg har formateret dato'erne til formen dd-mm-yyyy så der proppes et "0" foran hvis enten dag eller måned er mindre end 10 (hvis det var det du mente). Denne formatering sker i 'writeDate(tbId, date)'-metoden.

- Jeg har samtidigt ændret at udregningerne først udføres når der forlades et felt. Dette løser det problem du beskrev med at Dato ændres når man hopper videre til Måneder.



<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <script type="text/JavaScript">
       
        var outputId = "output";
        var dateNow;
        var oneMonth = 1000*60*60*24*31;
       
        function intializeDateNow(tbId)
        {
            dateNow = new Date();
           
            writeDate(tbId, dateNow);         
        }
       
        function writeOutput(msg)
        {
            document.getElementById(outputId).value = msg;
        }
       
        function writeDate(tbId, date)
        {
            var days = date.getDate().toString();
            var month = (date.getMonth()+1).toString();
            var years = date.getFullYear().toString();
           
            days = days.length == 1 ? "0" + days : days;
            month = month.length == 1 ? "0" + month : month;
           
            document.getElementById(tbId).value = days + "-" + month + "-" + years;
        }
       
        function calculateMonths(elmDate, monthId)
        {
            writeOutput("");
           
            var arrDate = elmDate.value.split("-");
           
            if(arrDate.length != 3 || arrDate[2].length != 4)
            {
                writeOutput("'Dato' field must be of form:    dd-mm-yyyy");
                return;
            }
           
            var strDay = arrDate[0];
            var strMonth = arrDate[1];
            var strYear = arrDate[2];
           
            var tmpDate = new Date(strYear, strMonth, strDay);
           
            if( isNaN(tmpDate) )
            {
                writeOutput("'Dato' field must be of form:    dd-mm-yyyy");
                elmDate.focus();
                return;
            }
           
            tmpDate = new Date(tmpDate.toGMTString());
            var gmtDate = new Date(dateNow.toGMTString());
         
            if(tmpDate < dateNow)
            {
                writeOutput("'Dato' skal være senere en Dags dato");
                elmDate.focus();
                return;
            }
           
            var newDate = Math.floor((tmpDate.getTime() - dateNow.getTime())/oneMonth);
            document.getElementById(monthId).value =newDate;
        }
       
        function calculateDate(elmDate, dateId)
        {
            writeOutput("");
           
            if(elmDate.value == "")
                return;
           
            var months = parseInt(elmDate.value);
           
            if( isNaN(months) || months < 0)
                writeOutput("Måneder skal være en heltalsværdi større en 0.");

            var date = new Date(dateNow.toGMTString());
            var newDate = new Date(date.getYear(), date.getMonth() + months, date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds());
            writeDate(dateId, newDate);
        }

       
        </script>
    </head>
    <body onload="intializeDateNow('datenow');">
        <table>
            <tr>
                <td style="width: 100px;">Dags dato:</td>
                <td><input id="datenow" type="text" readonly="readonly" /></td>
            </tr>
            <tr>
                <td>Dato:</td>
                <td><input id="date" type="text" onchange="calculateMonths(this, 'month');" /></td>
            </tr>
            <tr>
                <td>Måneder:</td>
                <td><input id="month" type="text" onchange="calculateDate(this, 'date')" /></td>
            </tr>
            <tr>
                <td>Output:</td>
                <td><input id="output" readonly="readonly" type="text" style="width: 600px; border: 0; color: Red;" /></td>
            </tr>
        </table>
    </body>
</html>




Lidt dumme fejl jeg havde overset, men det blev også lidt sent igår! :)


Du må lige skrive hvis der stadig mangler noget! :)


Mvh.

- Snap
Avatar billede Morten Nybegynder
04. marts 2007 - 13:56 #9
Hey Snap

Håber du er på pinden, nu er jeg igang med at implementerer ovenstående script, men hvis nu mine felter hedder Dato (datenow) - Udloebsdato (date) - Hosting (month)

Burde jeg så ikke bare rette til:

  <body onload="intializeDateNow('dato');">
        <table>
            <tr>
                <td style="width: 100px;">Dags dato:</td>
                <td><input id="dato" type="text" readonly="readonly" /></td>
            </tr>
            <tr>
                <td>Dato:</td>
                <td><input id="udloebsdato" type="text" onchange="calculateMonths(this, 'hosting');" /></td>
            </tr>
            <tr>
                <td>Måneder:</td>
                <td><input id="hosting" type="text" onchange="calculateDate(this, 'udloebsdato')" /></td>
            </tr>
            <tr>
                <td>Output:</td>
                <td><input id="output" readonly="readonly" type="text" style="width: 600px; border: 0; color: Red;" /></td>
            </tr>
        </table>
    </body>

?? Kan ikke få det til at virke....
Avatar billede Morten Nybegynder
04. marts 2007 - 13:58 #10
Javascriptfejl:

fejl: 'document.getElementById(...)' er null eller ikke et objekt ???
Avatar billede crazysnap Seniormester
04. marts 2007 - 15:28 #11
Hej cddk,

Nu er jeg på min pind! :)

Har prøvet at kopiere din body direkte ind i min side og der virker det upåklageligt! :/

Prøv at kopiere alt scriptet fra 27/02-2007 09:31:53 ind i en html fil og erstat body'en med din. Der må have gået noget galt i kopieren :)


Mvh.

- Snap
Avatar billede crazysnap Seniormester
04. marts 2007 - 15:46 #12
Fandt lige en lille fejl som gør scriptet ikke virker korrekt i FF. Du skal lige ændre:

date.getYear()

til:

date.getFullYear()

i 'calculateDate' metoden i anden nederstre linje. :) kopierer lige hele metoden ind for god ordens skyld:


function calculateDate(elmDate, dateId)
{
    writeOutput("");
   
    if(elmDate.value == "")
        return;
   
    var months = parseInt(elmDate.value);
   
    if( isNaN(months) || months < 0)
        writeOutput("Måneder skal være en heltalsværdi større en 0.");

    var date = new Date(dateNow.toGMTString());
    var newDate = new Date(date.getFullYear(), date.getMonth() + months, date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds());
    writeDate(dateId, newDate);
}


Mvh.

- Snap
Avatar billede Morten Nybegynder
04. marts 2007 - 15:57 #13
Hmmm... det er fordi jeg ikke har output feltet med i min formular.... såsnart jeg indsætter den så virker det.
Avatar billede crazysnap Seniormester
04. marts 2007 - 16:08 #14
Ja selvfølgelig,

Det kan bare fjernes fra scriptet. :)

Du kan jo lade selve output-metoden være der og bare udkommentere indmaden så du nemt kan implementere den igen hvis du for brug for noget output.
Så hvis du bare udkommenterer indmaden af 'writeOut' metoden burde scriptet køre fint uden et output felt. :)

Så metoden kommer altså til at se sådan ud nu:


function writeOutput(msg)
{
    //document.getElementById(outputId).value = msg;
}


Mvh.

- Snap :)
Avatar billede Morten Nybegynder
04. marts 2007 - 16:14 #15
Jeg lavede det til et skjult felt
Avatar billede crazysnap Seniormester
04. marts 2007 - 16:22 #16
Hov, min 'Ja selvgølgelig'-udtalelse fra før var ikke en overlegen udtalelse, men ment som 'Nåhh ja, selvfølgelig' fra min side! :)


Men du kan også bare skjule output feltet ja! :)


Mvh.

- Snap
Avatar billede Morten Nybegynder
04. marts 2007 - 16:23 #17
LOL - læste det heller slet ikke sådan... smid et svar så jeg kan kyle dine velfortjente points efter dig LOL
Avatar billede crazysnap Seniormester
04. marts 2007 - 16:28 #18
Hehe, godt så! :)


Her har du et svar og glad for jeg kunne hjælpe. Du må endelig skrive hvis der opstår mangler/bugs. :)


Tak for pointene!


Mvh.

- Snap
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester