Avatar billede eksperten1 Nybegynder
21. januar 2003 - 16:50 Der er 30 kommentarer og
1 løsning

Oprettelse af flere <Select> ud fra Array

På en side skal brugeren kunne vælge op til 9 forskellige kategorier en side kan være tildelt. Der findes ca. 2000 kategorier.
Pt. laver jeg de 9 select's fra ASP så de findes i HTML'en og skal overføres fra serveren. Det tager en helvedes tid.!
Jeg ville gerne lave et JS array i ASP og så kalde en funktion som så kan fylde de enkelte selects op. Det skal være sådan at jeg kan specificere hvilken select der er target, samt hvilken der er SELECTED. (der er både en Value og en optiontekst til hver option.
<option value='12345678'>Taxi og vognmænd</option>

Giver det her mening. ?

Min tanke

function fillSelect(sname, sel)
{
js her
}

onLoad="fillSelect('kode1',102564)

Håber på at en af jer genier kan hjælpe evt. kender et link.

mvh
Mark
Avatar billede Slettet bruger
21. januar 2003 - 16:56 #1
Skal al informationen være i én select-boks?
Avatar billede eksperten1 Nybegynder
21. januar 2003 - 17:05 #2
Nej, der er oprettet 9 tomme selects. "kode1","kode2",..."kode9"

Så vil jeg lave js arrayet i ASP og kalde funktionen 9 gange, med navnet på den select der skal fyldes samt hvilket select.value der skal være Selected.

mvh
Mark
Avatar billede bearhugx Nybegynder
21. januar 2003 - 17:05 #3
Hmmm du skal jo alligevel via ASP indsætte OptionTekst .. er det ikke så en formsag at påføre, hvilken der er selected ???

Eller misforstår jeg noget ?
/Søren
Avatar billede Slettet bruger
21. januar 2003 - 17:07 #4
Hvorfor ikke bare en select multiple?
Avatar billede bearhugx Nybegynder
21. januar 2003 - 17:11 #5
ahhh -- jeg tror jeg forstår....


function selectItem( selectObj, selectedValue ) {
  var optArray = selectObj.getElementsByTagName("option");
  for(i=0; i<optArray.length; ++i) {
    if(optArray[i].value==selectedValue) {
      optArray[i].selected = "selected";
    }
  }
}

selectItem(kode1, "181818");

/Søren
Avatar billede eksperten1 Nybegynder
21. januar 2003 - 17:11 #6
>bearhugx, så kan jeg nøjes med at indsætte en værdi i de 9 js kald. Meget hurtigere og mindre at overføre fra serveren.

>phoenixv, fordi at når der er 2000 kategorier kan de ikke overskue hvilke kategorier der er valgt i en select multiple. Jeg har ellers overvejet det.:)

mvh
Mark
Avatar billede eksperten1 Nybegynder
21. januar 2003 - 17:25 #7
>bearhugx, din funktion sætter jo godt nok hvilken en der er selected, men problemet er at den først skal kopiere alle værdierne fra et array ned i den option som funktionen kaldes med.

Jeg laver 9 tomme selects: <select name="kode1"></select>...<select name="kode9"></select>. Samtidig laver jeg et JS array med alle værdierne som skal være i ALLE 9 selects. Men for at kunne indstille hvilken en der er slected i hver select, skal denne funktion kaldes 9 gange, med henholdsvis navnet og værdien for hver sleect. JS Funktionen skal så kopiere alle værdierne (select.value, select.text) ned i select "kode9" og når den støder på den som jeg har sendt med som værende selected "formitem.selected = true;"

ET af problemerne er bare at jeg ikke ved hvordan jeg 1. opretter et array, 2. henter værdierne derfra. Det skal jo være et 2dimensionelt array, med plads til både .value samt .text

mvh
Mark
(som skal lave mad til familien nu og er tilbage om 2 timer!;)
Avatar billede olebole Juniormester
21. januar 2003 - 23:03 #8
<ole>

Skal du fylde 9 selects, vil det vel være nogget lettere at oprette 9 todimensionelle arrays:

<html>
<head>
<script type="text/JavaScript">
var k_0 = [
    "val1",
    ["val0","txt0"],
    ["val1","txt1"],
    ["val2","txt2"]
];
var k_1 = [
    "val3",
    ["val0","txt0"],
    ["val1","txt1"],
    ["val2","txt2"],
    ["val3","txt3"],
    ["val4","txt4"]
];
function fillSel(inx) {
    var a = eval("k_"+inx);
    var s = document.f.elements["kode_"+inx];
    for (j=1; j<a.length; j++) {
        var opt = new Option( a[j][1], a[j][0] );
        if ( a[0]== a[j][0]) opt.selected = true;
        s.options[s.length] = opt;
    }
}
window.onload = function() {
    for (i=0; i<2; i++) { // 2 for antallet af selects
        fillSel(i);
    }
}
</script>
</head>
<body>

<form name="f">

<select name="kode_0">
</select>

<select name="kode_1">
</select>

</form>

</body>
</html>

/mvh
</bole>
Avatar billede olebole Juniormester
21. januar 2003 - 23:11 #9
De to arrays har jeg skrevet pænt for overskuelighedens skyld. Når du skriver dem ud i ASP, kan du naturligvis bare skrive dem på én linie. Det vil spare udskrivningstid og fylde betydelig mindre i download.
Hvis ikke din database opdateres hele tiden (hvert 5. minut eller sådan), ville jeg udskrive en statisk fil med disse arrays, hver gang databasen opdateres. Denne fil skal så bare inkluderes i den HTML-fil, brugeren får serveret.
Det vil tage en enorm belastning af din database og dit site vil performe voldsomt meget bedre - og gøre brugeroplevelsen tilsvarende bedre.
/mvh
Avatar billede olebole Juniormester
21. januar 2003 - 23:16 #10
Hvis det er bedre i forhold til dine DB-træk og hvilke options, der skal være selected, kan du også skrive script'et sådan:

<script type="text/JavaScript">
var k_0 = [
    ["val0","txt0"],
    ["val1","txt1"],
    ["val2","txt2"]
];
var k_1 = [
    ["val0","txt0"],
    ["val1","txt1"],
    ["val2","txt2"],
    ["val3","txt3"],
    ["val4","txt4"]
];
var sInxs = ["val1","val3"];
function fillSel(inx) {
    var a = eval("k_"+inx);
    var s = document.f.elements["kode_"+inx];
    for (j=0; j<a.length; j++) {
        var opt = new Option( a[j][1], a[j][0] );
        if ( sInxs[inx]== a[j][0]) opt.selected = true;
        s.options[s.length] = opt;
    }
}
window.onload = function() {
    for (i=0; i<2; i++) { // 2 for antallet af selects
        fillSel(i);
    }
}
</script>

/mvh
Avatar billede eksperten1 Nybegynder
22. januar 2003 - 09:08 #11
Det kunne vist være at jeg skal beskrive funktionaliteten.
Sitet indeholder en masse firmaoplysninger, alle disse firmaer har mellem 1 og 9 kategorier tilvalgt. I et administrationsdel kan brugeren/ejeren ændre/tildele en eller flere kategorier til et firma.
Eftersom at der allerede ER tildelt kategorier, er det nødvendigt at jeg kan vælge hvilken en kategori for hver enkelt select der er "selected", altså valgt på forhånd.
!! Der er nøjagtig de samme option i alle 9 selects, de er altså 100% ens, undtaget hvilken en der er selected !!

Grunden til at jeg gerne vil nøjes med at lave et array var for at spare CPU'kraft, men der vil blive ændret en del i DB'en.

Det er altså nødvendigt at jeg kan kalde en funktion, både med navnet SAMT med hvilken en option der skal være "selected" for hver enkelt select.

Måske er det fordi jeg ikke forstår dit script ole, hvor fortæller jeg hvilken option der er selected ?

1000 tak for hjælpen
Mark
Avatar billede eksperten1 Nybegynder
22. januar 2003 - 12:56 #12
>olebole. Er det muligt at du kunne ændre i dit script, således at der kun er 1 array, det indeholder så alle værdierne. Scriptet kan så modtage 2 parametre, 1. Navnet på den select som skal udfyldes, 2. værdien på den option som skal være selected. ?

mvh
Mark
Avatar billede olebole Juniormester
22. januar 2003 - 13:03 #13
Okay .... ja, klarhed er jo velgørende  ;o)

<script type="text/JavaScript">
var k = [
    ["val0","txt0"],
    ["val1","txt1"],
    ["val2","txt2"],
    ["val3","txt3"],
    ["val4","txt4"],
    ["val5","txt5"]
];
var sInxs = ["val1","val3"]; // Pre-selectede værdier
function fillSel(inx) {
    var s = document.f.elements["kode_"+inx];
    for (j=1; j<k.length; j++) {
        var opt = new Option( k[j][1], k[j][0] );
        if ( sInxs[inx]== k[j][0]) opt.selected = true;
        s.options[s.length] = opt;
    }
}
window.onload = function() {
    for (i=0; i<2; i++) { // 2 for antallet af selects
        fillSel(i);
    }
}
</script>

Og linien, hvor jeg select'er en værdi, er denne:
  if ( sInxs[inx]== k[j][0]) opt.selected = true;

/mvh
Avatar billede olebole Juniormester
22. januar 2003 - 13:04 #14
ups ... ret lige:
  for (j=1; j<k.length; j++) {
til:
  for (j=0; j<k.length; j++) {
Avatar billede eksperten1 Nybegynder
22. januar 2003 - 13:09 #15
>olebole. Tak for et speedy response.:) Jeg må lige spørge, var sInxs, er det den der indeholder hvilke værdier som er preselectede ?

Nu har jeg jo 9 selects, skriver jeg så
var sInxs = ["12345","23456","345678","456789","5678901","123321","234432","567765","123987"]

Så vil den så matche dem op imod 1. 2. ... 9. select ?

mvh
Mark
Avatar billede eksperten1 Nybegynder
22. januar 2003 - 13:41 #16
>olebole. Sig mig lige sInxs (INXS, phun intended ??)
Avatar billede eksperten1 Nybegynder
22. januar 2003 - 13:56 #17
>olebole. Jeg får en fejl på flg. linje:
s.options[s.length] = opt;
"options er null eller ikke et objekt."

Ændrede en smule (f = form1)

<script type="text/JavaScript">
var k = [
    ["val0","txt0"],
    ["val1","txt1"],
    ["val2","txt2"],
    ["val3","txt3"],
    ["val4","txt4"],
    ["val5","txt5"]
];
var sInxs = ["val1","val3"]; // Pre-selectede værdier
function fillSel(inx) {
    var s = document.form1.elements["kode"+inx];
    for (j=0; j<k.length; j++) {
        var opt = new Option( k[j][1], k[j][0] );
        if ( sInxs[inx]== k[j][0]) opt.selected = true;
        s.options[s.length] = opt;
    }
}
window.onload = function() {
    for (i=0; i<2; i++) { // 2 for antallet af selects
        fillSel(i);
    }
}
</script>

mvh
Mark
Avatar billede olebole Juniormester
22. januar 2003 - 13:59 #18
Nemlig - og ret denne linie også:
  for (i=0; i<2; i++) { // 2 for antallet af selects

En lille forklaring:

function fillSel(inx) {
// Definer, hvilken select, der skal fyldes:
    var s = document.f.elements["kode_"+inx];
// Gå array'et igennem:
    for (j=0; j<k.length; j++) {
// Dan en option for hvert element i array'et,
// der jo også er et array med to elementer:
        var opt = new Option( k[j][1], k[j][0] );
// Hvis array-elementets (det aktuelle lille array)
// er lig med den sInxs-værdi, der hører til selecten,
// sættes denne option som selected:
        if ( sInxs[inx]== k[j][0]) opt.selected = true;
// Den nydannede option indsættes i select-boksen på sidste plads
        s.options[s.length] = opt;
    }
}

/mvh
Avatar billede olebole Juniormester
22. januar 2003 - 14:01 #19
Fejlen opstår, hvis dine selects ikke passer med dette:

<form name="f">

<select name="kode_0">
</select>

<select name="kode_1">
</select>

</form>

De skal hedde 'kode_' plus et tal - og der skal være 9 af dem
/mvh
Avatar billede eksperten1 Nybegynder
22. januar 2003 - 14:02 #20
Men hvorfor får jeg så en fejl ? Der er jo oprettet de 2 selects. (jeg venter lige med at udvide til 9!)

mvh
Mark
Avatar billede olebole Juniormester
22. januar 2003 - 14:02 #21
'form1' er helt okay  ;o)
Avatar billede eksperten1 Nybegynder
22. januar 2003 - 14:05 #22
Jeg har ændret det til ["form"+inx], har 2 selects "kode1" "kode2" i formen name="form1" !?
:?
Avatar billede olebole Juniormester
22. januar 2003 - 14:06 #23
Antallet af elementer i 'sInxs' skal passe med antallet af selects i formen.
Det samme gælder denne linie:
  for (i=0; i<2; i++) { // 2 for antallet af selects
Dine selects skal være navngivet rigtig.

Så kommer der ingen fejl  ;o)
/mvh
Avatar billede olebole Juniormester
22. januar 2003 - 14:07 #24
Hvis du får fejl, må du uploade koden og skrive URL'en her
Avatar billede eksperten1 Nybegynder
22. januar 2003 - 14:08 #25
Weird, jeg mener også at det er korrekt: Men får stadig fejlen s.options er null eller ikke et object.

<script type="text/JavaScript">
var k = [
    ["val0","txt0"],
    ["val1","txt1"],
    ["val2","txt2"],
    ["val3","txt3"],
    ["val4","txt4"],
    ["val5","txt5"]
];
var sInxs = ["val1","val3"]; // Pre-selectede værdier
function fillSel(inx) {
    var s = document.form1.elements["kode"+inx];
    for (j=0; j<k.length; j++) {
        var opt = new Option( k[j][1], k[j][0] );
        if ( sInxs[inx]== k[j][0]) opt.selected = true;
        s.options[s.length] = opt;
    }
}
window.onload = function() {
    for (i=0; i<2; i++) { // 2 for antallet af selects
        fillSel(i);
    }
}
</script>

mvh
Mark
Avatar billede eksperten1 Nybegynder
22. januar 2003 - 14:12 #26
>ole, kan du ikke smide en mail til mig, har ikke lyst til den direkte url herinde ? mark@koalit.com
Avatar billede pelkjaer Nybegynder
22. januar 2003 - 14:32 #27
Alle>>Overordnet skal løsninger på eksperten være tilgængelige for alle. Derfor må man normalt ikke tildele point for opgaver løst internt via mail.

Men lige denne her sag er iorden mener jeg, da en løsning netop er tilgængelig - spørger skal bare have yderligere hjælp til indsætning af denne.

pelkjaer - coadmin
Avatar billede eksperten1 Nybegynder
22. januar 2003 - 14:54 #28
>pelkjaer, er der blevet klaget over det ?

Jeg skal derudover nok sørge for at funktionen havner her til sidst. Tror jeg nu også at olebole nok skulle sørge for dette.

mvh
Mark
Eksperten1
Avatar billede olebole Juniormester
22. januar 2003 - 14:56 #29
Jeg takker og vil lige pointere, at grunden til pelkjaer her blandede sig ikke var 'nævenyttighed' eller trang til at gøre sig bemærket ... jeg bad ham selv om en coAdmin-vurdering og kommentar over ICQ  ;o)
Avatar billede eksperten1 Nybegynder
22. januar 2003 - 14:57 #30
Så har Olebole fået funktionen til at fungere.

--
<script type="text/JavaScript">
var k = [
    ["val0","txt0"],
    ["val1","txt1"],
    ["val2","txt2"],
    ["val3","txt3"],
    ["val4","txt4"],
    ["val5","txt5"]
];
var sInxs = ["val1","val3","val2"]; // Pre-selectede værdier
function fillSel(inx) {
    var s = document.form1.elements["kode"+inx];
    for (j=0; j<k.length; j++) {
        var opt = new Option( k[j][1], k[j][0] );
        if ( sInxs[inx]== k[j][0]) opt.selected = true;
        s.options[s.length] = opt;
    }
}
window.onload = function() {
    for (i=0; i<3; i++) { // 3 for antallet af selects
        fillSel(i);
    }
}
</script>
--
Avatar billede eksperten1 Nybegynder
22. januar 2003 - 15:05 #31
OK, undrede mig også over at den bemærkning kom ind fra sidelinjen :-)
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