JavaScript: Fødselsdags SELECT

Tags:    html5 php javascript

Hej Udviklere.

Jeg sidder med et problem, som jeg virkelig bander langt væk nu.
-------------------------
Forklaringen:

Vi ved jo alle at der kun er 28 dage i Februar, enkelte tilfælde er der 29.
Denne kode bruges til en registrerings formular, som jeg bruger på tværs af 7 hjemmesider (de bruger det samme user system).

Hvordan i h. får jeg gjort så når man har valgt Februar (man vælger måned først), så er der kun 28 punkter i dag SELECT'en?

Jeg har siddet i flere timer, og prøvet at finde ud af det, og ikke engang mine hold kammerater eller tidligere hold kammerater (Web Integrator, Roskilde Tekniske Skole) har kunnet hjælpe.

Er der nogle af jer der er søde hjælpe mig med det her, inden jeg bliver helt sur på det her JavaScript pis?

--------------------------
Koder:

Der er følgende:
Måned
Fold kodeboks ind/udHTML kode 


Dag:
Fold kodeboks ind/udPHP kode 


Nederst på siden kører jeg følgende JavaScript, som jeg har fundet et sted på nettet:

Fold kodeboks ind/udJScript kode 




Indlæg senest redigeret d. 09.02.2012 20:58 af Bruger #10243
8 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
JS:
Fold kodeboks ind/udKode 


PHP:
Fold kodeboks ind/udPHP kode 





MB's indlæg ser ud som en fornuftig løsning, men skal jeg bare bruge min.js jQuery biblioteket? (folk undlader altid at skrive hvilket JS script man skal bruge - der er mange jQuery scripts)...

Michael Larsen, jeg syntes det var lidt for indviklet dét der...
Jeg er fremdeles ikke god til JavaScript, prøver at kæmpe mig igennem rumlen, så jeg kan en del JavaScript til min svendeprøve...



Mit bruger bare jquery 1.6+, om du så bruger minified eller ej er ligegyldigt - i produktion er det fint. Når det er live burde du bruge minified :)

Jeg var så igang med at bruge et array istedet for den lange if sætning - men det kan du kigge videre på.



Indlæg senest redigeret d. 10.02.2012 09:39 af Bruger #15754
@Mikkel - Michaels løsning er da den mindst komplicerede.

At loope over det, som MB gør er tosset - fordi så har du problemet næste år, når det ikke er skud år, og der kun er 28 dage i februar. Og problemet igen om fire - når det er skud år igen... Det er altså molbo-stil!

Michaels løsning er så meget bedre, fordi den vil virke uden tilpasninger for fremtiden.

Mit kendskab til javascript er meget overfladisk, men mit bud vil gøre brug af to simple algoritmer.
1) Skudårs algoritme; "er det skudår" int (årstal) -> bool: årstal % 4 = 0 AND ((årstal % 100 != 0) OR (årstal % 400 = 0))

2) "Kort eller lang måned ved at tælle knoer"-algoritme - den her kender vi fra vi var børn. Venstre hånd knyttes og holdes op. Tæl knoer og mellem rum mellem knoer fra venstre med højre pege finger:
- Januar - på venstre lille finger kno
- Februar - mellem lille og ringe finger kno
- Marts - på ringe kno
- April - mellem ringe og lange kno
- Maj - på lange kno
- Juni - mellem lange og pege kno
- Juli - på pege kno
- August - på lille kno
- September - mellem lige og ringe kno
- Oktober - på ringe kno
- November - mellem ringe og lange
- December - på lange kno

Er det en lang måned så har den 31 dage, er det en kort har den 30 - er det en kort og februar har den 28 eller 29 hvis det er skudår.

Implementering i javascript:

Fold kodeboks ind/udJScript kode 


Så kalder du bare daysInMonth med to parametre - månedstal og årstal - og så returnerer den antallet af dage i et år. Den virker for alle årstal.

En javascript haj vil sikkert kunne optimere koden og gøre den endnu simplere.



Når man skal vælge sin fødselsdag, så er skudår vel lige meget. Det skal altid være der, siden årstal ikke bliver taget med.



MB: Jeg havde ikke lavet select'en til årstal i mit eget eksempel, men jo den skal med, da vi på den ene hjemmeside, tæller hvor gammel personen er :)
Men skudår eller ej er ikke ligemeget, vi er alle enige om, at fødselsdatoen skal være korrekt, og at der derfor ikke kan være 30 eller 31 dage i Februar (Jeg har selv fødselsdag i Februar).

Gustav: Når folk spørger mig, på en skala fra 0 - 100 hvor god jeg er til JavaScript, siger jeg altid -100, da jeg sjældent kan få det til at virke, og det eneste jeg har fået til at virke, er at vise og skjule fx. specifikke DIV tags.

Jeg prøver din løsning.

---------------------------
EDIT

Gustav: Jeg har implementeret din løsning, problemet er nu bare at jeg får følgende fejl:
Warning: assignment to undeclared variable $days
Source File: scripts/birthday.js
Line: 21

Linie 21:
Fold kodeboks ind/udJScript kode 


Jeg får også fejl når jeg laver en for loop:

Warning: assignment to undeclared variable $i
Source File: register.php
Line: 125

Linie 125:

Fold kodeboks ind/udJScript kode 


Jeg har også prøvet følgende, men får samme fejl:

Fold kodeboks ind/udJScript kode 


NB: New Option er taget fra denne side:
http://www.javascriptkit.com/javatutors/selectcontent.shtml



Indlæg senest redigeret d. 10.02.2012 13:13 af Bruger #10243
@MB - det er ikke afgørende - det kan vi godt blive enige om. Men hvad er en fødselsdato værd, hvis der ikke er årstal med - og hvorfor ikke implementere hensyntagen til årstal, når det nu er så let...

@Mikkel, Du skal nok indsætte en var days = new Number; eller sådan noget i toppen. Den brokker sig over at den ikke er defineret før du piller med den. (toppen af funktionen den bliver brugt i selvfølgeligt).

Har du prøvet at sætte $ foran dine variabel navne i din for-løkke? Det er kun når man definerer variabler at man ikke skal bruge dem - altså når du skriver var enVariabel = something - når du bruger den skal den så kaldes med $enVariabel.



Du kan arbejde videre med det her jeg har lavet, det er kun javascript ved hjælp af jquery biblioteket, så der er ikke noget php kode.

Fold kodeboks ind/udHTML kode 


Fold kodeboks ind/udJScript kode 




t