Avatar billede elskermad.dk Nybegynder
27. februar 2006 - 10:49 Der er 6 kommentarer og
1 løsning

Søgning i en selectbox

Hej Eksperter!

Jeg har en selectbox med en masse værdier og for lettere at kunne finde den rette værdi kunne jeg godt tænke mig at kunne søge i den, og de værdier der ikke passer med søgeteksten skal så forsvinde...

Altså man skal have en tekstboks og en selectboks. Selectboksen indeholder en masse værdier som kunne se sådan her ud:
<option value='3245'>Hej med dig</option>

Scriptet skal så hver gang man ændrer tekstboksen (ved onKeyup) fjerne de værdier i selectboksen som ikke passer med søge teksten. Jeg går ud fra at der skal søges via en løkke og noget indexOf, men hvordan ved jeg ikke...

Scriptet skal hele tiden kunne indsætte de fjernede værdier igen, hvis man gør søgeteksten mindre.

Jeg har ingen idéer om hvordan det skal gøres, så kunne godt tænke mig lidt hjælp :)
Avatar billede mm12010 Nybegynder
27. februar 2006 - 12:38 #1
sådan?

http://www.phoenixv.dk/arkiv.html >> Formularer >> Dynamisk select-boks
Avatar billede elskermad.dk Nybegynder
27. februar 2006 - 14:11 #2
ja bortset fra den ikke søger i feltets navn (altså ikke value, men det man "ser") og at den søger fra venstre mod højre, den skal også kunne inde midt i teksten
Avatar billede thesurfer Nybegynder
27. februar 2006 - 15:21 #3
Hvis du vil have den til at søge i hele ordet, og ikke kun "fra venstre mod højre", skal du bare erstatte "== 0" med "> -1":

    if (felt.value == "" || valg[i].toLowerCase().indexOf(felt.value.toLowerCase()) > -1)

Ang: altså ikke value, men det man "ser"

Dvs, du vil gerne søge på "Hej med dig", i stedet for "3245", jvf dit eksempel.. Korrekt?

/theSurfer
Avatar billede thesurfer Nybegynder
27. februar 2006 - 16:19 #4
Her er en modificeret udgave af "Dynamisk select-boks", som gør det du vil have:


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Modificeret udgave af &quot;Dynamisk select-boks&quot;, http://www.phoenixv.dk/arkiv.html &gt;&gt; Formularer &gt;&gt; Dynamisk select-boks</title>
<script type="text/javascript">
valg = new Array("Albatros", "Anders", "And", "Asger", "Bi", "Blomst", "Benjamin", "Bølle", "Citron", "Cykel", "Flæskestej");

valg.sort(); // sætter ordene i alfabetisk rækkefølge

// Arrayen "tmpArray" forbinder teksten med værdien (value),
// da værdierne blev sorteret alfabetisk ved "valg.sort()",
// hvilket ændrer på rækkefølgen.
// Det er derfor ikke muligt bare at oprette endnu en array,
// med løbende værdien, til teksterne (eller omvendt)..
//
// Formatet på "tmpArray"-arrayen er:
//
// TEKST#VALUE
//
// TEKST: det man kan se (og vælge/søge på)
// VALUE: det man IKKE kan se (som fanges med ".value")
//

tmpArray = new Array(
"Albatros#1234",
"Anders#5678",
"And#abcd",
"Asger#efgh",
"Bi#ijkl",
"Blomst#mnop",
"Benjamin#qrst",
"Bølle#uvwx",
"Citron#yz12",
"Cykel#3456",
"Flæskestej#7890"
);

tmp = "";
txt = new Array();
for (i=0; i < valg.length; i++) // looper igennem "valg"-arrayen
{

    for (j=0; j < tmpArray.length; j++) // looper igennem "tmpArray"-arrayen
    {
        tmp = tmpArray[j].substring(0, tmpArray[j].indexOf("#")) // smid valg over i variablen (f.eks. "Albatros")

        if (tmp.toLowerCase() == valg[i].toLowerCase()) { // sammenlign valg med det før "#".. er de ens?

            // Yep de er ens.. tilføj fra positionen af "#", plus 1 tegn (f.eks. "1234"), til en ny array:
            txt[txt.length] = tmpArray[j].substring(tmpArray[j].indexOf("#") + 1);
       
        }

    }

}

function opdater(felt) {
  selOpts = felt.form.sel.options;
  selOpts.length = 0;
  for (i = 0; i < valg.length; i++)
    if (felt.value == "" || valg[i].toLowerCase().indexOf(felt.value.toLowerCase()) > -1)
      selOpts[selOpts.length] = new Option(valg[i], txt[i]); // Jeg har ændret den ene "valg[i]" til "txt[i]"
}
</script>
</head>
<body onLoad="document.frm.sFelt.focus();">

<h2>Dynamisk select-boks</h2>
<form name="frm">
<input type="text" name="sFelt" onKeyUp="opdater(this);" style="width: 150px;" /><br />
<select multiple="multiple" size="8" name="sel" style="width: 150px;">
<script type="text/javascript">
t = ""; // BRUGES KUN TIL DEBUG!
out = "";
for (i = 0; i < valg.length; i++)
{
    out = '<option value="' + txt[i] + '">' + valg[i] + '</option>'; // Jeg har ændret den ene "valg[i]" til "txt[i]"
  document.write(out);
    t += out + '\n'; // BRUGES KUN TIL DEBUG!
}

</script>
</select><br /><br />
<input type="submit" value="Send" />
</form>


<!-- DEBUGGING_start -->
<div id="debug">test<div>
<script type="text/JavaScript">
t = t.replace(/</gi, "&lt;");
t = t.replace(/>/gi, "&gt;");
t = t.replace(/\n/gi, "<br>");
document.getElementById("debug").innerHTML = "<br><hr><b>Debug</b>:<br>" + t + "<hr>";
</script>
<!-- DEBUGGING_slut -->

</body>
</html>


Original kildekode: http://www.phoenixv.dk/arkiv.html >> Formularer >> Dynamisk select-boks

/theSurfer
Avatar billede elskermad.dk Nybegynder
27. februar 2006 - 17:04 #5
det ser helt rigtigt ud! bortset fra at jeg ikke rigtig kan se hvordan det fungerer :P men det er jo så ikke dit problem hehe...

er det muligt at gøre så der kun skal laves et array med oplysninger? så valg-arrayet ikke er nødvendigt, men kun tmpArray... ellers så smid et svar så du kan få dine velfortjente points :)
Avatar billede thesurfer Nybegynder
27. februar 2006 - 17:24 #6
Problemet opstår ved sortering efter alfabetisk rækkefølge, da den jo ændrer rækkefølge på dataene.

Man kan f.eks. "automatisere" tmpArray, så du ikke selv behøver at skrive "Albatros" osv..

Det ser sådan ud (erstatter tidligere kodeblok, der passer med dennes start og slut):

valg = new Array("Albatros", "Anders", "And", "Asger", "Bi", "Blomst", "Benjamin", "Bølle", "Citron", "Cykel", "Flæskestej");
tmpArray = new Array("1234", "5678", "abcd", "efgh", "ijkl", "mnop", "qrst", "uvwx", "yz12", "3456", "7890");

for (i = 0; i < valg.length; i++)
{
    // Denne linie sætter det på så det er på formattet "TEKST#VALUE", f.eks "Albatros#1234":
    tmpArray[i] = valg[i] + "#" + tmpArray[i];
}

valg.sort(); // sætter ordene i alfabetisk rækkefølge

// Arrayen "tmpArray" forbinder teksten med værdien (value),
// da værdierne blev sorteret alfabetisk ved "valg.sort()",
// hvilket ændrer på rækkefølgen.
// Det er derfor ikke muligt bare at oprette endnu en array,
// med løbende værdien, til teksterne (eller omvendt)..
//
// Formatet på "tmpArray"-arrayen er:
//
// TEKST#VALUE
//
// TEKST: det man kan se (og vælge/søge på)
// VALUE: det man IKKE kan se (som fanges med ".value")
//

tmp = "";


Jeg kom lige i tanke om noget.. man har 2 værdier, som man vil indsætte i en array..
Man kan vist bare bruge en 2-dimensionelt array..
Eksempel:

tmp = new Array();
tmp[0][0] = "Albatros";
tmp[0][1] = "1234";
tmp[1][0] = "Anders";
tmp[1][1] = "5678";
osv..

Det burde give samme resultat..

- Svar

/theSurfer
Avatar billede thesurfer Nybegynder
27. februar 2006 - 19:54 #7
Takker for points :-)

/theSurfer
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