Avatar billede baitianlong Nybegynder
02. januar 2005 - 01:29 Der er 20 kommentarer og
1 løsning

Selector samarbejde.

Når man vælger måned i den ene selector, skal den næste have det rette antal dage:

Her er scriptet med selectorne:

<script type="text/javascript">
maaneder = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
dage = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
document.write('<select name="month" size="1" onChange="setDay(this.value);">');
for(i=0;i<maaneder.length;i++) {
    document.write('<option value="'+(i+1)+'">'+maaneder[i]+'</option>');
}
document.write('</select>');
document.write('<Select name="day" size="1">');
for(i=1;i<=31;i++) {
    document.write('<option value="'+i+'">'+i+'</option>');
}
document.write('</select>');
</script>

Men jeg kan ikke rigtig finde ud af at komme i gang med funktionen setDay().
Avatar billede roenving Novice
02. januar 2005 - 01:41 #1
Du skal i hvert fald ikke bruge document.write, for den sletter alt andet i dokumentet !-)

-- vil lige kigge på den, for den er ikke så svær !o]
Avatar billede baitianlong Nybegynder
02. januar 2005 - 01:44 #2
Jeg har det her nu, men det virker ikke

function setDay(tal) {
    dage = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    for(i=0;i<document.tagform.day.options.length;i++) {
        document.tagform.day.options[i] = null;
    }
    for(i=1;i<=dage[tal];i++) {
        document.tagform.day.options[i] = i;
    }
}
Avatar billede roenving Novice
02. januar 2005 - 02:09 #3
Prøv med:

<form>
<select name="month" onchange="if(this.selectedIndex>0)changeSelectDays(this)">
  <option value="">Vælg måned</option>
  <option value="Januar">Januar</option>
  <option value="Februar">Februar</option>
  <option value="Marts">Marts</option>
  <option value="April">April</option>
  <option value="Maj">Maj</option>
  <option value="Juni">Juni</option>
  <option value="Juli">Juli</option>
  <option value="August">August</option>
  <option value="September">September</option>
  <option value="Oktober">Oktober</option>
  <option value="November">November</option>
  <option value="December">December</option>
</select>
<select name="day">
</select>
<script type="text/javascript">
dage = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
function changeSelectDays(sel){
  newSel = sel.form.day;
  newSel.length = 0;
  for(i=0;+dage[sel.selectedIndex-1]>i;i++){
    newSel.options[i] = new Option(i+1,i+1);
  }
}
</script>
</form>
Avatar billede baitianlong Nybegynder
02. januar 2005 - 02:22 #4
Den ser ud til at virke, men ak... der skal jo også en år selector på, så funktionen skal også checke om man vælger et skudår, og så putte 29 i, men det er vel ikke så vildt?

Hvis året der vælges i den selector er skudår og månedstingen står på februar, skal day have 29, eller hvis året, der er valgt i år selectoren er skudår og man vælger februar... kan vi fikse det
Avatar billede roenving Novice
02. januar 2005 - 02:34 #5
Holder kun indtil år 2099 -- men det er vel også tilstrækkeligt !-)

<script type="text/javascript">
dage = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
if(new Date().getFullYear()%4 == 0)dage[1] = 29;
function changeSelectDays(sel){
  newSel = sel.form.day;
  newSel.length = 0;
  for(i=0;+dage[sel.selectedIndex-1]>i;i++){
    newSel.options[i] = new Option(i+1,i+1);
  }
}
</script>
Avatar billede baitianlong Nybegynder
02. januar 2005 - 02:44 #6
Jamen den selector med årene går fra 1935 til aktuelt år, og skal også kalde funktionen ...og skifte dagsantal (hvis februar)
Avatar billede roenving Novice
02. januar 2005 - 03:08 #7
<select name="year">
  <option value="1935" selected>1935</option>
  <option value="1936" >1936</option>
</select>
<select name="month" onchange="if(this.selectedIndex>0)changeSelectDays(this)">
  <option value="">Vælg måned</option>
  <option value="Januar">Januar</option>
  <option value="Februar">Februar</option>
  <option value="Marts">Marts</option>
  <option value="April">April</option>
  <option value="Maj">Maj</option>
  <option value="Juni">Juni</option>
  <option value="Juli">Juli</option>
  <option value="August">August</option>
  <option value="September">September</option>
  <option value="Oktober">Oktober</option>
  <option value="November">November</option>
  <option value="December">December</option>
</select>
<select name="day">
</select>
</form>

<script type="text/javascript">
dage = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
function changeSelectDays(sel){
  dage[1] = (new Date(+sel.form.year.value,0,1).getFullYear()%4 == 0)?29:28;
  newSel = sel.form.day;
  newSel.length = 0;
  for(i=0;+dage[sel.selectedIndex-1]>i;i++){
    newSel.options[i] = new Option(i+1,i+1);
  }
}
</script>
Avatar billede olebole Juniormester
02. januar 2005 - 10:04 #8
<ole>

En detalje, roenving: Skudår er ikke 'bare' hvert fjerde år - men vi kan lade JS checke om det pågældende år er et skudår:

<script type="text/JavaScript">
function setSel(f) {
    var leap, num, dayNum = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    if (f.year.value>-1 && f.month.value>-1) {
        if (f.month.value==1) {
            leap = (f.month.value==1 && new Date(f.year.value, f.month.value, 29).getMonth()==f.month.value)
            num = (leap)? 29 : 28;
        }
        else num = dayNum[f.month.value];
        f.day.disabled = false;
        f.day.options.length = 1;
        for (i=1; i<num+1; i++) {
            f.day.options[i] = new Option(i,i);
        }
    }
    else f.day.disabled = true;
}
</script>

<form>
<select name="year" onchange="setSel(this.form)">
    <option value="-1">Vælg</option>
    <option value="1960">1960</option>
    <option value="1961">1961</option>
    <option value="1962">1962</option>
    <option value="1963">1963</option>
    <option value="1964">1964</option>
    <option value="1965">1965</option>
    <option value="1966">1966</option>
    <option value="1967">1967</option>
    <option value="1968">1968</option>
    <option value="1969">1969</option>
    <option value="1970">1970</option>
</select>
<select name="month" onchange="setSel(this.form)">
    <option value="-1">Vælg</option>
    <option value="0">Jan</option>
    <option value="1">Feb</option>
    <option value="2">Mar</option>
    <option value="3">Apr</option>
    <option value="4">Maj</option>
    <option value="5">Jun</option>
    <option value="6">Jul</option>
    <option value="7">Aug</option>
    <option value="8">Sep</option>
    <option value="9">Okt</option>
    <option value="10">Nov</option>
    <option value="11">Dec</option>
</select>
<select name="day" disabled>
    <option value="-1">Vælg</option>
</select>
</form>

/mvh
</bole>
Avatar billede olebole Juniormester
02. januar 2005 - 10:07 #9
PS: Hvis man loader Date-objektet med den 29. februar, så vil det returnere 1. marts, hvis der ikke er tale om et skudår - det er bare det, jeg gør  :)
Avatar billede olebole Juniormester
02. januar 2005 - 10:11 #10
PPS: Reglen lyder i øvrigt:

(Årstal%4==0) -> Skudår
(Årstal%100==0) -> Ikke skudår
(Årstal%400==0) -> Skudår alligevel
Avatar billede baitianlong Nybegynder
02. januar 2005 - 15:08 #11
olebole -> Det ser smukt ud, og den kører perfekt, da funktionen også kaldes på year-selectoren. Men kan jeg ikke bygge mine selectors op med for-løkker og document.write. Det er lidt træls at lave den fra 1935-1936-1937 osv.
Avatar billede olebole Juniormester
02. januar 2005 - 16:06 #12
Joooh ... men du er da så vidt jeg husker PHP'er. Så er det jo bare at lave en løkke og skrive select'en ud. Hvis du fiedler lidt rundt med betingelserne, kan du vel bruge noget à la:

<?
$year = date("Y", time());
$s = "";
for ($i=$year-70; $i<$year+10; $i++) {
    $selected = ($i==$year-10)? " selected" : "";
    $s .= "<option value=\"".$i."\"".$selected.">".$i."</option>";
}
?>

<select><?=$s?></select>
Avatar billede olebole Juniormester
02. januar 2005 - 16:08 #13
Denne linie tilpasser du naturligvis til, hvad du forventer gennemsnittet af dine brugere vil vælge, så de ikke skal scrolle så meget:
  $selected = ($i==$year-10)? " selected" : "";
Avatar billede olebole Juniormester
02. januar 2005 - 16:09 #14
... og så naturligvis:
  <select><option value="-1">Vælg</option><?=$s?></select>  ;o)
Avatar billede baitianlong Nybegynder
02. januar 2005 - 16:20 #15
Ja selvfølgelig. Jeg ved ikke hvorfor jeg absolut ville bygge den med javascript :P

Men med al respekt for roenving, er det dog denne løsning, der ramte plet, derfor svar! olebole :)
Avatar billede roenving Novice
04. januar 2005 - 01:29 #16
Ha, ole, jeg var fuldt opmærksom på, at der er enkelte år, som man umiddelbart ville tro er skudår, som ikke er det, men det så ud som om den ting, der blev bygget på, ikke kom i nærheden af de to nærmeste tilfælde (nemlig år 1900 og år 2100 !-)
Avatar billede olebole Juniormester
07. januar 2005 - 15:21 #17
roenving >> Gør, som du vil. Jeg gider i hvert fald ikke skrive mine scripts om til den tid ... og så i en alder af 145 år!  ;D
Avatar billede olebole Juniormester
07. januar 2005 - 15:22 #18
... og så li'e et svar til legende  :)
Avatar billede baitianlong Nybegynder
08. januar 2005 - 04:41 #19
Jeg er blevet indoktrineret med den skide (year%400==0 || (year%4==0 && year%100!=0)) i 2½ år (datamatiker studiet), så den er jeg rimelig "sat med"... Anyway. Jeg kunne copy/paste <o/b>'s script lige ind i min php-side. Håber det er 'ok' Roenving. Tak til jer begge !! I er sgu smukke !
Avatar billede roenving Novice
08. januar 2005 - 10:36 #20
*lol*

-- og du er helt velkommen, til at give ole point !-)
Avatar billede olebole Juniormester
08. januar 2005 - 10:58 #21
Hehe ... for at være 'kvajet og Frank' (quite frank), så kunne jeg ikke selv huske reglen - kun at der var afvigelser. Derfor lod jeg Date-objektet selv afgøre.
Først da jeg skulle argumentere for løsningen fes jeg ud på WWW og fandt reglen  :)

Fremfor at lade Date selv ligge og rode med at finde en evt. afvigelese, er din egen betingelse på 'Year' i virkeligheden nok bedre/hurtigere ... omend det vist er lidt mindre end 'marginalt'  ;o)

Tak for points  :)
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