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:
<select name="sel1" id="sel1" onchange="createOpts(this,'sel1','sel2');">
<option value="" selected>Vis alle</option>
</select>
<select name="sel2" id="sel2">
<option value="" selected
><-- 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>
<select name="sel2" id="sel2">
<option value="" selected
><-- 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)";