Avatar billede bolmer Nybegynder
26. maj 2005 - 16:55 Der er 10 kommentarer og
1 løsning

2. drop down menu afhængig af 1. drop down menu??

Jeg har lavet to drop/down menuer i JSP. Når man vælger noget fra den ene menu skal det påvirke de muligheder der kommer frem i den anden menu.

Findes der nogle gode tutorials til hvordan man kommer igang med det, ved ikke hvor man skal starte?
Avatar billede skovenborg Nybegynder
26. maj 2005 - 17:03 #1
Avatar billede bolmer Nybegynder
26. maj 2005 - 17:12 #2
Lige præcis! Det er den øverste med 2 bokse. Hvis jeg vælger "View Page Source" får jeg en ordenligt smøre som jeg ikke forstå meget af både med source til 2 bokse og 3 bokse.

Findes der en vejledning til 2 bokse modellen?
Avatar billede skovenborg Nybegynder
26. maj 2005 - 18:32 #3
Måske du vil få lidt mere ud af det, hvis man helt fjernede den tredje selectbox og dets valgmuligheder:

<script type="text/javascript">
var arr = [
    ["Valg 1",["2. valg 1 (1)","2. valg 2 (1)","2. valg 3 (1)"]],
    ["Valg 2",["2. valg 1 (2)","2. valg 2 (2)","2. valg 3 (2)","2. valg 4 (2)"]],
    ["Valg 3",["2. valg 1 (3)","2. valg 2 (3)","2. valg 3 (3)","2. valg 4 (3)","2. valg 5 (3)"]]
];
function initSels(){
    createOpts(document.getElementById('sel1'));
}

function createOpts(sel){
    var s = new Array();
    var num = 0, txt = "arr";
    var ar = opt = null;
    var n = sel.selectedIndex;
    var args = createOpts.arguments.length;
    for(var i=1;args>i;i++){
        s[i-1] = document.getElementById(createOpts.arguments[i]);
        if(s[i-1]==sel)num=i;
    }
    if(args>1){
        if(s[num])sel = s[num];
        else return;
    }
    if(n==0&&args>1){
        for(i=num;args>i+1;i++){
            s[i].length = 0;
            opt = document.createElement('OPTION');
            s[i].appendChild(opt);
            opt.value = "";
            opt.text = "\74-- Vælg --";
        }
        return true
    };
    for(i=0;num>i;i++){
        txt+="["+(s[i].selectedIndex-1)+"][1]";
    }
    ar = eval(txt);
    sel.length = 0;
    opt = document.createElement('OPTION');
    sel.appendChild(opt);
  opt.value = "";
  opt.text = "-- Vælg --";
    for(i=0;ar.length>i;i++){
        opt = document.createElement('OPTION');
        sel.appendChild(opt);
        if(typeof ar[i] == 'object'){
          opt.value = ar[i][0];
          opt.text = ar[i][0];
        }else{
          opt.value = ar[i];
          opt.text = ar[i];
      }
    }
    if(args>num+2){
        for(i=num+1;args-1>i;i++){
            s[i].length = 0;
            opt = document.createElement('OPTION');
            s[i].appendChild(opt);
            opt.value = "";
            opt.text = "\74-- Vælg --";
        }
    }
}
</script>
</head>
<body onload="initSels()">
<form name="sels" action="about:blank">
To afhængige selects:&nbsp;&nbsp;&nbsp;
<select name="sel1" id="sel1" onchange="createOpts(this,'sel1','sel2');">
<option value="" selected>Vis alle</option>
</select>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<select name="sel2" id="sel2">
<option value="" selected
>&lt;-- Vælg --</option>
</select>
</form>

Scriptet er, egentlig ganske smart, bygget til at kunne behandle uendelig mange selectboxe - derfor ser scriptet så også temmelig uoverskueligt og bøvlet ud i forhold til hvis man bare skulle bruge to (har også set en anden løsning kun med to, som måske var lidt mere enkel, men kan ikke huske hvor den er mere).

Men så svært er det nu heller ikke at bruge den, men jeg vil nu lige lave en lille guide alligevel:
Hele scriptet er stort set bygget op omkring array'et arr, som indeholder oplysninger om det forskellige selectboxes værdier. Det er dette array du skal generere med din JSP-kode.
Som du måske ved kan et array skrives sådan her:
var arr = []; // det samme som var arr = new Array();
og det på denne form hele arrayet er bygget op på (du kan også vælge den "normale" måde, hvis du synes det er lettere. I hvert fald giver jeg et eksempel på det senere.

Array'et arr skal nu indeholde nogle "underarrayes", som er bygget op på denne måde:
["Værdi i 1. selectbox",[array med værdier i den anden selectbox]]
Arrayet med værdierne til den anden selectbox er de værdier, som skal blive synlige hvis man vælger "Værdi i 1. selectbox". Så hvis du kigger på det samlede array:
var arr = [
    ["Valg 1",["2. valg 1 (1)","2. valg 2 (1)","2. valg 3 (1)"]],
    ["Valg 2",["2. valg 1 (2)","2. valg 2 (2)","2. valg 3 (2)","2. valg 4 (2)"]],
    ["Valg 3",["2. valg 1 (3)","2. valg 2 (3)","2. valg 3 (3)","2. valg 4 (3)","2. valg 5 (3)"]]
];
Kan du måske set, at når man vælger "Valg 1" i 1. selectbox, så kommer værdierne "2. valg 1(1), 2. valg 2 (1) osv. frem i anden selectbox.


Når du har lavet dette array, skal du sætte formene op. Først og fremmest gælder det om, at begge selectboxe har hver deres unikke ID, fx:
<select name="sel1" id="sel1">
<option value="" selected>Vis alle</option>
</select>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<select name="sel2" id="sel2">
<option value="" selected
>&lt;-- Vælg --</option>
</select>
Navnet er mest til brug når du submitter formen. Når disse to selectboxe er lavet skal der kun tilføjes to ekstra events:
<body onload="initSels()"> - som sørger for, at værdierne i selectbox 1 bliver vist fra starten.

<select name="sel1" id="sel1" onchange="createOpts(this,'sel1','sel2');"> - denne sørger for, at værdierne bliver ændret i selectboxen med id sel2 når man ændrer på selectbox 1. createOpts-funktionen kræver, at du skriver alle de id'er, på samtlige selectboxe der skal indgå i scriptet.

Hvis du har fattet det indtil nu så tillykke, for der er ikke mere (medmindre du vil forstå selve javascript-koden, for det tager nu længere tid at forklare). Hvis du stadig synes at array'et er bygget op på en forvirrende og træls måde, så kan det også skrives på andre måder fx:
var arr = new Array();
arr[0] = ["Valg 1",["2. valg 1 (1)","2. valg 2 (1)","2. valg 3 (1)"]];
arr[1] = ["Valg 2",["2. valg 1 (2)","2. valg 2 (2)","2. valg 3 (2)","2. valg 4 (2)"]];
arr[2] = ["Valg 3",["2. valg 1 (3)","2. valg 2 (3)","2. valg 3 (3)","2. valg 4 (3)","2. valg 5 (3)"]];

eller den rigtig bøvlede, men måske mere forklarende måde:
var arr = new Array();
arr[0] = new Array();
arr[0][0] = "Valg 1";
arr[0][1] = new Array();
arr[0][1][0] = "2. valg 1 (1)";
arr[0][1][1] = "2. valg 2 (1)";
Avatar billede bolmer Nybegynder
26. maj 2005 - 19:58 #4
Hvor skal man ligge det der script? Skal det gemmes for sig i en fil med en bestemt extension?
Avatar billede skovenborg Nybegynder
26. maj 2005 - 23:10 #5
tja, det kan du gøre, men det kan også bare sættes ind på siden som her. Hvis du vil have scriptet i en ekstern fil skal du flytte alt hvad der står mellem <script type="..."> og </script> ind i en fil og gemme den som <filnavn>.js. Så kan du hente den på din side ved at skrive:
<script type="text/javascript" src="etellerandet.js"></script>
og placer dette i din head-sektion.
Avatar billede bolmer Nybegynder
27. maj 2005 - 00:27 #6
Ok jeg har fået det indsat i min head del.

Hvorfor står der ikke txt = arr istedet for txt = "arr", når du første gang du definere arr ikke angiver det i anførelsestegn?
Avatar billede skovenborg Nybegynder
27. maj 2005 - 00:55 #7
txt skal angive navnet på array'et med alle værdierne. Dvs. du kan godt kalde array'et for selectArrayValues eller sådan noget, og så bare skrive txt = "selectArrayValues". Senere i scriptet kan du se, at der står ar = eval(txt). Hvilket betyder at ar bliver lig med array'et (eval() evaluerer tekst som javascriptkode).

Hvorfor roenving (som har lavet scriptet) har gjort det på den måde ved jeg egentlig ikke, men det er nok for at gøre scriptet lidt mere dynamisk. I teorien kunne man jo også bare skrive arr hele vejen istedet for at kopiere arrayet. Men smart er det jo hvis man gerne vil have ændret navnet på array'et til noget lidt mere beskrivende, så skal man kun ændre scriptet et sted :-)
Avatar billede skovenborg Nybegynder
27. maj 2005 - 01:02 #8
næ vent- txt bruges faktisk også til lidt mere:
for(i=0;num>i;i++){
        txt+="["+(s[i].selectedIndex-1)+"][1]";
}
Hvad den præcist bruges til kan jeg ikke lige overskue. Det er jo ikke noget helt enkelt script han har stykket. Man kunne jo håbe at roenving kiggede forbi på et tidspunkt - så kunne han nok give en lidt bedre forklaring på de enkelte dele ;-)
Avatar billede bolmer Nybegynder
27. maj 2005 - 09:30 #9
I den anden if sætninge er det ikke en fejl at ";" er røget udenfor tuborg klammen:

    if(n==0&&args>1){
        for(i=num;args>i+1;i++){
            s[i].length = 0;
            opt = document.createElement('OPTION');
            s[i].appendChild(opt);
            opt.value = "";
            opt.text = "\74-- Vælg --";
        }
        return true
    };

Virker som om den skulle have været efter "return true" i stedet.
Avatar billede roenving Novice
27. maj 2005 - 11:51 #10
Tjah, jeg tror godt jeg kan forklare scriptet, men det tog en krig at lave det, og det tager i hvert fald en kampagne eller to at forklare det ...

-- grunden til eval-tingen på teksten er at det var en metode, jeg kunne overskue til at være ligeglad med hvor jeg var i arrayet (det er på nogle leder kernen i den totale dynamik !-)
Avatar billede bolmer Nybegynder
07. juli 2005 - 11:48 #11
Fandt et simpler eksempel
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