Aanpassen date-selector-script

Status
Niet open voor verdere reacties.

estheridb

Gebruiker
Lid geworden
23 sep 2007
Berichten
7
Ik heb ergens een date-selector-script gevonden (auteur helaas niet vermeld), dat bijna perfect is voor mijn doel. Het geeft de weekdag, dag, maand en jaar. Default staat dit op de dag van vandaag. Door de datum te wijzigen, wijzigt de weekdag mee. Het script houdt rekening met het aantal dagen per maand, en zelfs met schrikkeljaren. Nu wil ik dit script in een formulier zetten, waarbij het een verplicht veld moet worden. Alle variabelen (weekdag, dag, maand, jaar) zijn echter aparte velden, dus dat is probleem 1. (Want als ze er 1 wijzigen, is dat vaak al voldoende keuze.) Daarnaast weet ik niet hoe het script kan zien dat er een keuze gemaakt is (normaal doe ik dat met Kies... of zo als default waarde). Graag zou ik het script zodanig wijzigen dat dag en maand de defaultwaarde Kies krijgen (jaar blijft staan op huidige jaar en weekdag is blank), en er bij een wijziging van maand en datum er automatisch een weekdag getoond wordt. Het moet verplicht zijn om 'kies' te veranderen. Het zou helemaal mooi zijn als je de huidige datum niet kunt kiezen. Ik heb zelf al uren lopen proberen, maar heb te weinig kennis van javascript om dit voor elkaar te krijgen.

Ik kan me voorstellen dat dit nogal een ingewikkelde wijziging is. Als tweede beste optie zou ik het veld niet verplicht maken, maar het script wel default de datum van morgen willen laten tonen. Die wijziging is wellicht simpeler. (Maar ook dat krijg ik niet voor elkaar.)

Alle input is welkom! (Bij voorbaat dank)

Hier is de code:
Code:
<script language="JavaScript1.1">
        <!--
        var min_year = 2007; 
        var max_year = 2009; 
        
        var weekday_showing = true;
        
        var dayofweek_returned_as_number = false;
        
        var month_returned_as_number = false;
        
        if (min_year <= 400)
         alert(".");
        
        function changeDays(numb,date_form) {
         mth = date_form.month.selectedIndex;
         sel = date_form.year.selectedIndex;
         yr = date_form.year.options[sel].text;
         if (numb != 1) {
          numDays = numDaysIn(mth,yr);
          date_form.day.options.length = numDays;
          for (i=27;i<numDays;i++) {
           date_form.day.options[i].text = i+1;
          }
         }
         day = date_form.day.selectedIndex+1;
         if (weekday_showing)
          date_form.dayofweek.selectedIndex = getWeekDay(mth,day,yr);
        }
        function numDaysIn(mth,yr) {
         if (mth==3 || mth==5 || mth==8 || mth==10) return 30;
         else if ((mth==1) && leapYear(yr)) return 29;
         else if (mth==1) return 28;
         else return 31;
        }
        function leapYear(yr) {
         if (((yr % 4 == 0) && yr % 100 != 0) || yr % 400 == 0)
          return true;
         else
          return false;
        }
        function arr() {
         this.length=arr.arguments.length;
         for (n=0;n<arr.arguments.length;n++) {
          this[n] = arr.arguments[n];
         }
        }
        
        weekdays = new arr("Zondag","Maandag","Dinsdag","Gesloten!",
         "Donderdag","Vrijdag","Zaterdag");
         
        months = new arr("Januari","Februari","Maart","April","Mei",
         "Juni","Juli","Augustus","September","Oktober","November","December");
        var cur = new Date();
         
        function getWeekDay(mth,day,yr) {
         first_day = firstDayOfYear(yr);
         for (num=0;num<mth;num++) {
          first_day += numDaysIn(num,yr);
         }
         first_day += day-1;
         return first_day%7;
        }
        function firstDayOfYear(yr) {
         diff = yr - 401;
         return parseInt((1 + diff + (diff / 4) - (diff / 100) + (diff / 400)) % 7);
        }
        function getFullYear(d) { // d is af date object
         yr = d.getYear();
         if (yr < 1000)
          yr+=1900;
         return yr;
        }
        
        if (weekday_showing) {
         document.write("<select name=weekdag size=1>");
         for (i=0;i<7;i++)
          document.write("<option"+(dayofweek_returned_as_number?" value="+i:"")
           +(cur.getDay()==i?" selected":"")+">"+weekdays[i]+"\n");
         document.write("</select>");
        }
        
        
        document.write("<select name=maand "
         + "onChange='changeDays(0,this.form)' size=1>");
        for (i=0;i<12;i++)
         document.write("<option"+(month_returned_as_number?" value="+i:"")
          +(cur.getMonth()==i?" selected":"")+">"+months[i]+"\n");
        
        
        document.write("</select><select name=dag size=1 "
         + "onChange='changeDays(1,this.form)'>\n");
        for (i=1;i<=numDaysIn(cur.getMonth(),getFullYear(cur));i++)
         document.write("<option"+(cur.getDate()==i?" selected":"")+">"+i+"\n");
        
        
        document.write("</select><select name=jaar "
         + "onChange='changeDays(0,this.form)' size=1>\n");
        for (i=min_year;i<max_year;i++)
         document.write("<option"+(getFullYear(cur)==i?" selected":"")+">"+i+"\n");
        document.write("</select>");
        // -->
        </script>
 
1 oplossing gevonden - belangrijkste oplossing nog open

Inmiddels heb ik het antwoord gevonden op mijn tweede beste optie, namelijk het script op morgen zetten. Na

var cur = new Date();

heb ik de code toegevoegd:

cur.setDate(cur.getDate()+1);


Blijft alleen het vraagstuk openstaan van de oplossing die ik het liefst zou zien...
 
Met vermelding van de auteur. ;)
PHP:
<html>
 <head>
  <meta http-equiv="Content-Language" content="nl">
  <title>Datum selectie script</title>
  <meta http-equiv="content-type" content="text/html;charset=iso-8859-1">
  <script type="text/javascript">
   <!--
    // Egel 070925 ;)

    var d0 = 0, d1 = 0, weekdag = new Array('Zondag','Maandag','Dinsdag','Woensdag','Donderdag','Vrijdag','Zaterdag','datumfout');

    function weekday() {
     var f = document.f, d = f.datum[f.datum.selectedIndex].value, m = f.maand[f.maand.selectedIndex].value - 1, j = f.jaar[f.jaar.selectedIndex].value;
     d1 = new Date(j,m,d,0,0,0);
     f.weekdag.value = (d1.getMonth() == m ? weekdag[d1.getDay()] : weekdag[7]);
     };

    function today() {
     var f = document.f, dt = new Date(), d = dt.getDate(), m = dt.getMonth(), j = dt.getFullYear();
     d0 = new Date(j,m,d,0,0,0);
     f.datum.selectedIndex = d - 1;
     f.maand.selectedIndex = m;
     f.jaar.selectedIndex  = j - 2007;
     weekday();
     };

    function checkform() {
     if (d0.getTime() == d1.getTime() || document.f.weekdag.value == weekdag[7]) {
      alert('Er is een foute datum of de datum van vandaag ingevuld!');
      return false;
      };
     alert('Goed ingevuld!'); return false; // testregel :)
     return true;
     };

   // -->
  </script>

 </head>
 <body onload="today();">

  <form name="f" onsubmit="return checkform();">
 
  <input readonly type="text" name="weekdag" value="--" size="9" title="De weekdag wordt automatisch uitgerekent.">

   <select name="datum" onChange="weekday();">
    <option value="1">&nbsp;1
    <option value="2">&nbsp;2
    <option value="3">&nbsp;3
    <option value="4">&nbsp;4
    <option value="5">&nbsp;5
    <option value="6">&nbsp;6
    <option value="7">&nbsp;7
    <option value="8">&nbsp;8
    <option value="9">&nbsp;9
    <option value="10">10
    <option value="11">11
    <option value="12">12
    <option value="13">13
    <option value="14">14
    <option value="15">15
    <option value="16">16
    <option value="17">17
    <option value="18">18
    <option value="19">19
    <option value="20">20
    <option value="21">21
    <option value="22">22
    <option value="23">23
    <option value="24">24
    <option value="25">25
    <option value="26">26
    <option value="27">27
    <option value="28">28
    <option value="29">29
    <option value="30">30
    <option value="31">31
   </select>

   <select name="maand" onChange="weekday();">
    <option value="1">Januari
    <option value="2">Februari
    <option value="3">Maart
    <option value="4">April
    <option value="5">Mei
    <option value="6">Juni
    <option value="7">Juli
    <option value="8">Augustus
    <option value="9">September
    <option value="10">Oktober
    <option value="11">November
    <option value="12">December
   </select>

   <select name="jaar" onChange="weekday();">
    <option value="2007">2007
    <option value="2008">2008
    <option value="2009">2009
   </select>

   <input type="submit" value="opsturen">

  </form>

 </body>
</html>
(bijlage)

Het script zet de datum van het formulier automatisch op vandaag en geeft ook de weekdag en een datumfout weer. Als vandaag of een foute datum is ingevuld weigert het op te sturen. :)


Vr.Gr. Egel.
 

Bijlagen

Ik bedenk me net dat je misschien wilt dat er alleen een toekomstige datum kan worden ingevuld. Dat kan door de controle functie aan te passen:
PHP:
    function checkform() {
     if (d0.getTime() >= d1.getTime() || document.f.weekdag.value == weekdag[7]) {
      alert('Er is geen toekomstige datum of een foute datum ingevuld!');
      return false;
      };
     alert('Goed ingevuld!'); return false; // testregel :)
     return true;
     };
:) Vr.Gr. Egel.
 
Laatst bewerkt:
Hartelijk dank voor je input Egel, en sorry voor de late reactie. Ik ben erg druk geweest met andere problemen.

Op zich een goed script :thumb:, maar ik vind het jammer dat mensen hierbij een foute datum kunnen kiezen. Op zich corrigeert het script dat dan wel weer goed, maar vanuit gebruiksgemak probeer ik liever te voorkomen dat mensen fouten kunnen maken, zodat ze helemaal geen foutmelding krijgen. Dat vond ik het sterke aan het script dat ik heb geplaatst: dat toont automatisch het juiste aantal dagen per maand en houdt zelfs rekening met schrikkeljaren, zodat ik er nooit meer naar om hoef te kijken.

Uit jouw script ben ik voornamelijk geïnteresseerd in het gedeelte dat controleert of er geen datum in het verleden of vandaag is geselecteerd (funtion checkform, neem ik aan). Is het mogelijk om dat gedeelte in te bouwen in het script dat ik eerder heb geplaatst? (Mijn eigen knutselwerk liep weer op niks uit, ik weet er helaas te weinig vanaf.)

Vermelding van auteur spreekt voor zich:)
 
Ik moest er wel een paar nachtjes over slapen! ;)
PHP:
<html>
 <head>
  <meta http-equiv="Content-Language" content="nl">
  <title>Datum script met controle</title>
  <meta http-equiv="content-type" content="text/html;charset=iso-8859-1">
  <script type="text/javascript">
   <!--
    // Egel 071018 ;)

    var d0 = 0, d1 = 0;

    function today() {
     var f = document.f, dt = new Date(), d = dt.getDate(), m = dt.getMonth(), j = dt.getFullYear();
     d0 = new Date(j,m,d,0,0,0);
     f.datum.selectedIndex = d - 1;
     f.maand.selectedIndex = m;
     f.jaar.selectedIndex  = j - 2007;
     };

    function nrdays() {
     var f = document.f, d = 29, m = f.maand[f.maand.selectedIndex].value - 1, j = f.jaar[f.jaar.selectedIndex].value;
     f.datum.length = 28;
     while (new Date(j,m,d,0,0,0).getMonth() == m) {
      f.datum.options[d-1] = new Option(d,d);
      d++;
      };
     };

    function weekday() {
     var f = document.f, d = f.datum[f.datum.selectedIndex].value, m = f.maand[f.maand.selectedIndex].value - 1, j = f.jaar[f.jaar.selectedIndex].value;
     d1 = new Date(j,m,d,0,0,0);
     f.weekdag.value = ['Zondag','Maandag','Dinsdag','Woensdag','Donderdag','Vrijdag','Zaterdag'][d1.getDay()];
     };

    function checkform() {
     if (d0.getTime() >= d1.getTime()) {
      alert('Er is geen toekomstige datum ingevuld!');
      return false;
      };
     alert('Goed ingevuld!'); return false; // testregel :)
     return true;
     };

   // -->
  </script>

 </head>
 <body onload="today(); nrdays(); weekday();">

  <form name="f" onsubmit="return checkform();">
 
  <input readonly type="text" name="weekdag" value="--" size="9" title="De weekdag wordt automatisch uitgerekent.">

   <select name="jaar" onChange="nrdays(); weekday();">
    <option value="2007">2007
    <option value="2008">2008
    <option value="2009">2009
   </select>

   <select name="maand" onChange="nrdays(); weekday();">
    <option value="1">Januari
    <option value="2">Februari
    <option value="3">Maart
    <option value="4">April
    <option value="5">Mei
    <option value="6">Juni
    <option value="7">Juli
    <option value="8">Augustus
    <option value="9">September
    <option value="10">Oktober
    <option value="11">November
    <option value="12">December
   </select>

   <select name="datum" onChange="weekday();">
    <option value="1">&nbsp;1
    <option value="2">&nbsp;2
    <option value="3">&nbsp;3
    <option value="4">&nbsp;4
    <option value="5">&nbsp;5
    <option value="6">&nbsp;6
    <option value="7">&nbsp;7
    <option value="8">&nbsp;8
    <option value="9">&nbsp;9
    <option value="10">10
    <option value="11">11
    <option value="12">12
    <option value="13">13
    <option value="14">14
    <option value="15">15
    <option value="16">16
    <option value="17">17
    <option value="18">18
    <option value="19">19
    <option value="20">20
    <option value="21">21
    <option value="22">22
    <option value="23">23
    <option value="24">24
    <option value="25">25
    <option value="26">26
    <option value="27">27
    <option value="28">28
   </select>

   <input type="submit" value="opsturen">

  </form>

 </body>
</html>
Zorgt ervoor dat je geen foute datum kan invullen. Het formulier staat in de volgorde jaar - maand - datum zodat je het van links naar rechts kan invullen.

Het script:
d0 en d1 zijn twee datumobjecten, d0 is de datum van vandaag, d1 de datum die is ingevuld (beide om 0:00'00" uur).

function today() vult het formulier in op vandaag en maakt d0.

function nrdays() zorgt voor het aantal dagen in een maand. Eerst knipt het ze op 28 en daarna komt er een dag per keer bij zolang die in dezelfde maand blijft vallen.

Dat laatste is de 'magie', ook van het vorige script.
var d = new Date(2007,0,35,0,0,0) kan, maar als je de maand opvraagt
d.getMonth() krijg je 1 (februari) en de datum
d.getDate() is 4.
Zo gaan alle maanden en schrikkeljaren goed. :)

function weekday() geeft de dag vd week en maakt d1.

function checkform() geeft een fout als d1.getTime() niet groter is als d0.getTime(). .getTime() geeft het aantal milliseconden sinds 1 jan 1970 GMT, zo heb je een getal voor het vergelijken van twee data.


Vr.Gr. Egel.
 
Nog een kleine aanvulling op Egel zijn code.
Je sluit best alle optiontags ook af.
Code:
<option value="1">&nbsp;1</option>
--Johan
 
</option> is optional ;) maar het is inderdaad beter tags altijd af te sluiten. :)

Met nog wat verbeteringen:
PHP:
<html>
 <head>
  <meta http-equiv="Content-Language" content="nl">
  <title>Datum script met controle</title>
  <meta http-equiv="content-type" content="text/html;charset=iso-8859-1">
  <script type="text/javascript">
   <!--
    // Egel 071019 ;)

    var d0 = 0, d1 = 0, memday = 1;

    function today() {
     var f = document.f, dt = new Date(), j = dt.getFullYear(), m = dt.getMonth(), d = dt.getDate();
     d0 = new Date(j,m,d);
     f.datum.selectedIndex = d - 1;
     f.maand.selectedIndex = m;
     f.jaar.selectedIndex  = j - 2007;
     memday = d;
     };

    function nrdays() {
     var f = document.f, j = f.jaar[f.jaar.selectedIndex].value, m = f.maand[f.maand.selectedIndex].value - 1, d = 32 - new Date(j,m,32).getDate(), l = f.datum.length;
     if (l > d) for (var i = l; i > d; i--) f.datum.options[i-1] = null;
     if (d > l) for (var i = l; i < d; i++) f.datum.options[i] = new Option(i+1,i+1);
     f.datum.selectedIndex = Math.min(d,memday) - 1;
     };

    function weekday() {
     var f = document.f, j = f.jaar[f.jaar.selectedIndex].value, m = f.maand[f.maand.selectedIndex].value - 1, d = f.datum[f.datum.selectedIndex].value;
     d1 = new Date(j,m,d);
     f.weekdag.value = ['Zondag','Maandag','Dinsdag','Woensdag','Donderdag','Vrijdag','Zaterdag'][d1.getDay()];
     };

    function remember() {
     var f = document.f;
     memday = f.datum[f.datum.selectedIndex].value;
     };

    function checkform() {
     if (d0.getTime() >= d1.getTime()) {
      alert('Er is geen toekomstige datum ingevuld!');
      return false;
      };
     alert('Goed ingevuld!'); return false; // testregel :)
     return true;
     };

   // -->
  </script>

 </head>
 <body onload="today(); nrdays(); weekday();">

  <form name="f" onsubmit="return checkform();">
 
  <input readonly type="text" name="weekdag" value="--" size="9" title="De weekdag wordt automatisch uitgerekent.">

   <select name="jaar" onChange="nrdays(); weekday();">
    <option value="2007">2007</option>
    <option value="2008">2008</option>
    <option value="2009">2009</option>
   </select>

   <select name="maand" onChange="nrdays(); weekday();">
    <option value="1">Januari</option>
    <option value="2">Februari</option>
    <option value="3">Maart</option>
    <option value="4">April</option>
    <option value="5">Mei</option>
    <option value="6">Juni</option>
    <option value="7">Juli</option>
    <option value="8">Augustus</option>
    <option value="9">September</option>
    <option value="10">Oktober</option>
    <option value="11">November</option>
    <option value="12">December</option>
   </select>

   <select name="datum" onChange="remember(); weekday();">
    <option value="1">&nbsp;1</option>
    <option value="2">&nbsp;2</option>
    <option value="3">&nbsp;3</option>
    <option value="4">&nbsp;4</option>
    <option value="5">&nbsp;5</option>
    <option value="6">&nbsp;6</option>
    <option value="7">&nbsp;7</option>
    <option value="8">&nbsp;8</option>
    <option value="9">&nbsp;9</option>
    <option value="10">10</option>
    <option value="11">11</option>
    <option value="12">12</option>
    <option value="13">13</option>
    <option value="14">14</option>
    <option value="15">15</option>
    <option value="16">16</option>
    <option value="17">17</option>
    <option value="18">18</option>
    <option value="19">19</option>
    <option value="20">20</option>
    <option value="21">21</option>
    <option value="22">22</option>
    <option value="23">23</option>
    <option value="24">24</option>
    <option value="25">25</option>
    <option value="26">26</option>
    <option value="27">27</option>
    <option value="28">28</option>
   </select>

   <input type="submit" value="opsturen">

  </form>

 </body>
</html>
Bijlage.

Het aantal dagen in een maand gaat met de formule 32 - new Date(j,m,32).getDate() voor februari 2008 bijvoorbeeld wordt dat 32 - new Date(2008,1,32).getDate() == 29 :)

Het script onthoudt ook de ingevulde datum zodat als je van maand wisselt (bv op 31 oktober > november > december) de ingevulde 31 weer terug komt.


Vr.Gr. Egel.
 

Bijlagen

Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan