Avatar billede axkris Nybegynder
16. juli 2005 - 20:41 Der er 32 kommentarer og
1 løsning

Kan ikke indsætte i dropdown-box - why?

Hej alle

Der udskrives "01020304050607080910111213141516171819202122232425262728293031" i stedet for en datoerne (dage) i en dropdown-box.

Hvor er fejlen?


        <div ID="files">                       
                       
        </div>

        <Input Type="Button" Value="tilføj fil" OnClick="return(Expand());" Style="border=0;background=white;cursor:hand"></td></tr>
               
        <Script>
          var nfiles = 1;
          function Expand(){
            nfiles++;
              files.insertAdjacentHTML('BeforeEnd','<select name="Date_Day" size="1" class="inputbox">');
           
            for (i = 1; i <= 31; i++) {
                files.insertAdjacentHTML('BeforeEnd','<option>' + i + '</option>');
            }
           
              files.insertAdjacentHTML('BeforeEnd','</select>');
            return false;
          }
        </Script>
Avatar billede roenving Novice
16. juli 2005 - 20:49 #1
Hvad er det du vil ?-)

-- kan du ikke bare have den select altid der, og så vise/skjule den ?-)
Avatar billede axkris Nybegynder
16. juli 2005 - 21:24 #2
Jeg skal såmen bare have mig en funktion, som kan lave en eller flere dropdown-boxe - alt efter hvor mange brugerne har brug for.
Avatar billede axkris Nybegynder
16. juli 2005 - 21:35 #3
Hvis jeg ændrer koden til - så parenteserne laves firkante:

        <div ID="files">                       
                       
        </div>

        <Input Type="Button" Value="tilføj fil" OnClick="return(Expand());" Style="border=0;background=white;cursor:hand"></td></tr>
               
        <Script>
          var nfiles = 1;
          function Expand(){
            nfiles++;
              files.insertAdjacentHTML('BeforeEnd','[select name="Date_Day" size="1" class="inputbox"]');
           
            for (i = 1; i <= 31; i++) {
                files.insertAdjacentHTML('BeforeEnd','[option]' + i + '[/option]');
            }
           
              files.insertAdjacentHTML('BeforeEnd','[/select]');
            return false;
          }
        </Script>       


Udskriver den tagene, som de skal (så man kan se dem):

[select name="Date_Day" size="1" class="inputbox"][option]1[/option][option]2[/option][option]3[/option][option]4[/option][option]5[/option][option]6[/option][option]7[/option][option]8[/option][option]9[/option][option]10[/option][option]11[/option][option]12[/option][option]13[/option][option]14[/option][option]15[/option][option]16[/option][option]17[/option][option]18[/option][option]19[/option][option]20[/option][option]21[/option][option]22[/option][option]23[/option][option]24[/option][option]25[/option][option]26[/option][option]27[/option][option]28[/option][option]29[/option][option]30[/option][option]31[/option][/select]

Så hvad er fejlen mon?
Avatar billede roenving Novice
16. juli 2005 - 21:41 #4
Jeg ville absolut bruge dom til at indsætte:

<div id="motherDiv">

</div>

<button onclick="appendSelect()">Indsæt ny select</button>

<script type="text/javascript">
function appendSelect(){
  var mother = document.getElementById('motherDiv');
  var newSel = document.createElement("SELECT");
  mother.appendChild(newSel);
  for(i=0;32>i;i++){
    newSel.options[newSel.length] = new Option(i);
  }
  var newLine = document.createElement("HR");
  mother.appendChild(newLine);
}
</script>

-- det har også den fordel, at når man benytter metoder taget fra standarden, vil det virke i alle nutidige browsere !-)
Avatar billede axkris Nybegynder
16. juli 2005 - 21:47 #5
Mange takker :-D

Tryk svar :-)
Avatar billede roenving Novice
16. juli 2005 - 21:48 #6
Velbekomme '-)
Avatar billede roenving Novice
16. juli 2005 - 21:49 #7
-- iøvrigt kan du også sætte alle de attributter, du måtte ønske:

newSel.size = '1';
newSel.className = 'inputbox';

osv.
Avatar billede roenving Novice
16. juli 2005 - 21:50 #8
-- og tak for point ;~}
Avatar billede axkris Nybegynder
16. juli 2005 - 21:51 #9
Takker :-D
Avatar billede axkris Nybegynder
16. juli 2005 - 22:06 #10
Så nu kører det ;-)

Dog mangler jeg at den skal indsætte et mellemrum mellem dropdown-boxene (ikke et linieskift) og så mangler jeg også at få getYear() eller en lignende indbygget js-funktion til at virke.

Noget du kan hjælpe mig med?

<script type="text/javascript">

function appendSelect(){
   
    var mother = document.getElementById('motherDiv');
    var newSel = document.createElement("SELECT");
    newSel.size = '1';
    newSel.className = 'Date_Day';
    mother.appendChild(newSel);
   
    for(i=0;32>i;i++){
        newSel.options[newSel.length] = new Option(i);
    }
   
    var newSel = document.createElement("SELECT");
    newSel.size = '1';
    newSel.className = 'Date_Month';
    mother.appendChild(newSel);
   
    for(i=0;13>i;i++){
        newSel.options[newSel.length] = new Option(i);
    }
   
    var newSel = document.createElement("SELECT");
    newSel.size = '1';
    newSel.className = 'Date_Year';
    mother.appendChild(newSel);
   
    //3 år frem i tiden
    for(i=0;3>i;i++){
        newSel.options[newSel.length] = new Option(getYear() + i);
    }
   
    var newLine = document.createElement("HR");
    mother.appendChild(newLine);

}

</script>
Avatar billede axkris Nybegynder
16. juli 2005 - 22:16 #11
Nå fik selv datoen til at virke:

        newSel.options[newSel.length] = new Option(new Date().getYear() + i);

Roder nu rundt med at få indsat det mellemrum, så dropdown-boxene ikke sidder lige op ad hinanden.
Avatar billede roenving Novice
16. juli 2005 - 22:16 #12
className svarer til class-attributten, så hvis du vil have, at den skal have et navn skal du sætte .name !-)

Men f.eks. sådan:

<div id="motherDiv">

</div>

<button onclick="appendSelect()">Indsæt ny select</button>

<script type="text/javascript">

function appendSelect(){
   
    var mother = document.getElementById('motherDiv');
    var newSel = document.createElement("SELECT");
    newSel.size = '1';
    newSel.className = 'inputbox';
    newSel.name = 'Date_Day';
    mother.appendChild(newSel);
   
    for(i=0;32>i;i++){
        newSel.options[newSel.length] = new Option(i);
    }
   
    var dash = document.createTextNode(" ");
    mother.appendChild(dash);
   
    newSel = document.createElement("SELECT");
    newSel.size = '1';
    newSel.className = 'inputbox';
    newSel.name = 'Date_Month';
    mother.appendChild(newSel);
   
    for(i=0;13>i;i++){
        newSel.options[newSel.length] = new Option(i);
    }
   
    dash = dash.cloneNode(true);
    mother.appendChild(dash);
   
    newSel = document.createElement("SELECT");
    newSel.size = '1';
    newSel.className = 'inputbox';
    newSel.name = 'Date_Year';
    mother.appendChild(newSel);
   
    //3 år frem i tiden
    var year = new Date().getFullYear();
    for(i=0;3>i;i++){
        newSel.options[newSel.length] = new Option(year + i);
    }
   
    dash = dash.cloneNode(true);
    mother.appendChild(dash);
   
    var newLine = document.createElement("HR");
    mother.appendChild(newLine);

}

</script>

-- du skal bare være opmærksom på, at det kan blive besværligt at aflæse server-side, hvis du har en hel stribe elementer med det samme navn !-)
Avatar billede axkris Nybegynder
16. juli 2005 - 22:18 #13
Takker igen :-)
Avatar billede axkris Nybegynder
16. juli 2005 - 22:46 #14
Ja, nu ser jeg, hvad du mener med at håndtere det på server-siden (asp for mit vedkomne).

Hvordan løser man det? Kan man sætte select-taggene ind i en for-løkke også? Og hvordan gør man det smartest?
Avatar billede axkris Nybegynder
16. juli 2005 - 22:55 #15
Nu har jeg løst det på en anden måde:

<script type="text/javascript">

var intSelects = 0;

function appendSelect(){

    intSelects++;
   
    var mother = document.getElementById('motherDiv');
    var newSel = document.createElement("SELECT");
    newSel.size = '1';
    newSel.className = 'inputbox';
    newSel.name = 'Date_Day' + intSelects;
    mother.appendChild(newSel);
 
    for(i=0;32>i;i++){
        newSel.options[newSel.length] = new Option(i);
    }
 
    var dash = document.createTextNode(" ");
    mother.appendChild(dash);
 
    newSel = document.createElement("SELECT");
    newSel.size = '1';
    newSel.className = 'inputbox';
    newSel.name = 'Date_Month' + intSelects;
    mother.appendChild(newSel);
 
    for(i=0;13>i;i++){
        newSel.options[newSel.length] = new Option(i);
    }
 
    dash = dash.cloneNode(true);
    mother.appendChild(dash);
 
    newSel = document.createElement("SELECT");
    newSel.size = '1';
    newSel.className = 'inputbox';
    newSel.name = 'Date_Year' + intSelects;
    mother.appendChild(newSel);
 
    //3 år frem i tiden
    var year = new Date().getFullYear();
    for(i=0;3>i;i++){
        newSel.options[newSel.length] = new Option(year + i);
    }
 
    dash = dash.cloneNode(true);
    mother.appendChild(dash);
 
    var newLine = document.createElement("HR");
    mother.appendChild(newLine);

}

</script>

Kan det gøres bedre?
Avatar billede roenving Novice
16. juli 2005 - 23:06 #16
-- det kan gøres på mange andre måder, men det er absolut den simpleste, så skal du bare finde ud af, hvor mange der er, men det kan du vel sagtens ved bare at spørge på, om der findes en valgt værdi !-)
Avatar billede axkris Nybegynder
16. juli 2005 - 23:13 #17
Takker... og hvordan indsætter man så i value-delen i option-tagget her?

    newSel = document.createElement("SELECT");
    newSel.size = '1';
    newSel.className = 'inputbox';
    newSel.name = 'Date_Month' + intSelects;
    mother.appendChild(newSel);
 
    for(i=0;13>i;i++){
        newSel.options[newSel.length] = new Option(i);
    }

Jeg vil gerne have den synlige del af option til at indeholde månedens navn, men månedens værdi indsættes i value'n i tagget.
Avatar billede roenving Novice
16. juli 2005 - 23:36 #18
F.eks. sådan:

    var mName = ['januar','februar','marts','april','maj','juni','juli','august','september','oktober','november','december']; 
    for(i=0;13>i;i++){
        newSel.options[newSel.length] = new Option(mName[i],i);
    }
Avatar billede roenving Novice
16. juli 2005 - 23:38 #19
-- hov, der skal måske reguleres for måned nummer 0 eller 12, for mName[0] = 'januar' ...
Avatar billede axkris Nybegynder
17. juli 2005 - 00:34 #20
Takker :-)
Avatar billede axkris Nybegynder
17. juli 2005 - 11:36 #21
Hvordan bruger med selectedindex?

Har prøvet:

newSel.selectedIndex = 3;

og

newSel.selectedIndex[3] = true;
Avatar billede roenving Novice
17. juli 2005 - 12:30 #22
Begge virker, men ikke i alle situationer ens, men jeg kan ikke påvise et mønster, jeg har simpelthen ikke gidet at lave en masse browser-testeri !-)

-- men værdien skal selvfølgelig være relevant, så den kan(/bør) ikke sættes før options er smidt på ...
Avatar billede axkris Nybegynder
17. juli 2005 - 12:36 #23
Nå ja, det skal indsættes efter at optionen er sat, men hvordan gøres det?

Følgende udsnit virker ikke:

    var dash = document.createTextNode(" ");
    mother.appendChild(dash);
 
    newSel = document.createElement("SELECT");
    newSel.size = '1';
    newSel.className = 'inputbox';
    newSel.name = 'Date_Month' + intSelects;
    mother.appendChild(newSel);
         
    var mName = ['januar','februar','marts','april','maj','juni','juli','august','september','oktober','november','december'];
    for(i=0;13>i;i++){
        newSel.options[newSel.length] = new Option(mName[i],i);
    }
   
    newSel.selectedIndex[3] = true;
 
    dash = dash.cloneNode(true);
    mother.appendChild(dash);
 
    newSel = document.createElement("SELECT");
    newSel.size = '1';
    newSel.className = 'inputbox';
    newSel.name = 'Date_Year' + intSelects;
    mother.appendChild(newSel);

Jeg forsøger at ramme marts-måned (bare for at se om det virker).
Avatar billede roenving Novice
17. juli 2005 - 13:02 #24
Hov, jeg så forkert på dine forslag, for disse to virker:

newSel.selectedIndex = 3;

og

newSel.options[3] = true;

-- men de peger på den fjerde option, da den første har nummer 0, så du skal nok:

//Dage
    for(i=1;32>i;i++){
        newSel.options[newSel.length] = new Option(i);
    }

//Måneder
    var mName = ['januar','februar','marts','april','maj','juni','juli','august','september','oktober','november','december']; 
    for(i=0;12>i;i++){
        newSel.options[newSel.length] = new Option(mName[i],i+1);
    }
   
    newSel.selectedIndex = 3
Avatar billede roenving Novice
17. juli 2005 - 13:03 #25
Hov ...

    newSel.options[3].selected = true;

-- sæ'fø'li'
Avatar billede axkris Nybegynder
17. juli 2005 - 13:36 #26
Takker igen :-)
Avatar billede axkris Nybegynder
17. juli 2005 - 17:48 #27
Håber at du gider at hjælpe mig igen :-) Sig bare til, hvis jeg skal oprette et nyt spg.

Jeg vil gerne have funktionen til at plusse en uge til (set i forhold til den det sidste sæt dropdownboxe), for hvergang at folk trykker på knappen (så der kommer et nyt sæt dropdownbokse frem). Men desværre kan jeg ikke få Date() + 7 til at virke, som jeg kender fra VB.

Så hvad gør man så?

<script type="text/javascript">

var intSelects = 0;

function appendSelect(){

    intSelects++;
     
    if (intSelects == 1) {
        var thisDay = new Date().getDate();
        var thisMonth = new Date().getMonth();
          var thisYear = new Date().getFullYear();
    }
    else {
        // plus en uge - men hvordan ??????????????????????????????????
        var thisDay = parseInt(document.frmUser.elements["Date_Day" + (intSelects - 1)].value) + 7;
        var thisMonth = new Date().getMonth(); // mangler at gå til næste måned, hvis det er relevant
          var thisYear = new Date().getFullYear(); // mangler at gå til næste år, hvis det er relevant
    }
       
    var dash = document.createTextNode(" ");
    var mother = document.getElementById('motherDiv');
    var newSel = document.createElement("SELECT");
    newSel.size = '1';
    newSel.className = 'inputbox';
    newSel.name = 'Date_Day' + intSelects;
    mother.appendChild(newSel);
 
    for(i=1;32>i;i++){
        newSel.options[newSel.length] = new Option(i);
    }
   
      newSel.options[thisDay - 1].selected = true;
 
    mother.appendChild(dash);
 
    newSel = document.createElement("SELECT");
    newSel.size = '1';
    newSel.className = 'inputbox';
    newSel.name = 'Date_Month' + intSelects;
    mother.appendChild(newSel);
         
    var mName = ['januar','februar','marts','april','maj','juni','juli','august','september','oktober','november','december'];
    for(i=1;12>i;i++){
        newSel.options[newSel.length] = new Option(mName[i],i);
    }
   
    newSel.options[thisMonth - 1].selected = true;
 
    dash = dash.cloneNode(true);
    mother.appendChild(dash);
 
    newSel = document.createElement("SELECT");
    newSel.size = '1';
    newSel.className = 'inputbox';
    newSel.name = 'Date_Year' + intSelects;
    mother.appendChild(newSel);
 
    //3 år frem i tiden
    for(i=0;3>i;i++){
        newSel.options[newSel.length] = new Option(thisYear + i);
    }
 
    dash = dash.cloneNode(true);
    mother.appendChild(dash);
 
    var newLine = document.createElement("BR");
    mother.appendChild(newLine);

    var newLine = document.createElement("BR");
    mother.appendChild(newLine);
       
}
Avatar billede olebole Juniormester
17. juli 2005 - 18:04 #28
<ole>

Så let er det desværre ikke at rode med form-elementer i DOM  :o|

IE har en elendig håndtering af DOM og kan ikke med DOM sætte en name-attribute på et element, oprettet via DOM. Prøv f.eks. dette script:

<script type="text/JavaScript">
window.onload = function() {
    var sel = document.createElement("select");
    sel.name = "gnu";
    document.body.appendChild(sel);
    alert(document.body.innerHTML)
}
</script>

- end ikke dette kan IE klare:

<script type="text/JavaScript">
window.onload = function() {
    var sel = document.createElement("select");
    sel.setAttribute("name", "gnu");
    document.body.appendChild(sel);
    alert(document.body.innerHTML)
}
</script>

Du er nødt til at lave et browsercheck - og hvis det er en IE, må du skrive:

<script type="text/JavaScript">
window.onload = function() {
    var sel = document.createElement("<select name=\"gnu\"></select>");
    document.body.appendChild(sel);
    alert(document.body.innerHTML)
}
</script>

Husk i øvrigt, at tag-navnet bør skrives med småt i createElement  ;o)

/mvh
</bole>
Avatar billede axkris Nybegynder
17. juli 2005 - 18:18 #29
Hej Olebole

Ja, det er rigtigt nok. Min side funger heller ikke i IE (har jeg lige fundet ud af).

Linien:
var thisDay = parseInt(document.frmUser.elements["Date_Day" + (intSelects - 1)].value) + 7;

Giver fejlen:
'document.frmUser.elements[...].value'

Kan du hjælpe?
Avatar billede axkris Nybegynder
17. juli 2005 - 21:08 #30
Kan I hjælpe?
Avatar billede axkris Nybegynder
17. juli 2005 - 23:50 #31
Hvis jeg kører min side i IE, skriver den fejl ved:

alert(document.frmUser.Date_Day1);

Hvorimod den rigtigt nok udskriver værdien i Firefox. Findes der en løsning?
Avatar billede axkris Nybegynder
18. juli 2005 - 13:34 #32
Nå - løste selv problemet.

Med IE kan man ikke aflæse value på et element, hvis ikke denne er sat som en value (men blot som en text). Det kan man godt i Firefox, som blot tager text'en som value i stedet.

Så blev jeg lidt klogere. Det havde faktisk ikke noget med DOM at gøre.

Takker for hjælpen. Mit script kører fint, dog skal det lige udbygges lidt med "dato-plusning", men det starter jeg bare i en frisk tråd.

Lukker og slukker.
Avatar billede olebole Juniormester
18. juli 2005 - 18:25 #33
axkris >> Du er for hurtig. Jeg kan være ligeglad, men det kan du vist ikke  ;o)

IE kan ikke sætte name-attributter på form-elementer på den måde, du forsøger at gøre det. Prøv nu de eksempler, jeg skrev ... det var derfor, jeg skrev dem til dig  ;o)
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