Avatar billede htx98i17 Professor
10. januar 2006 - 22:21 Der er 16 kommentarer og
1 løsning

onchange - søg i array

Hej

jeg har et input-(firma) hvor jeg skriver firmanavn.
Jeg vil onchange have scriptet til at søge et array igennem for firmanavnet og så automatisk udfylde resten af inputfelterne.

Nogle der har et bud?
Avatar billede olebole Juniormester
10. januar 2006 - 22:26 #1
<ole>

Ja ... men ikke uden noget kode  :)

/mvh
</bole>
Avatar billede htx98i17 Professor
10. januar 2006 - 22:31 #2
Jamen jeg har ikek så meget. Har været ved at fumle lidt med at få det indskrevne til at poppe op. Det vil forøvrigt heller ikke fungere :) Det skal jeg have hjælp til og så skal jeg have hjælp til at søge i array.

<script language="javascript" >
           
            function tjekadresse() {
                alert(firma.value());
            }
       
        </script>

<input type="text" name="firma" onchange="tjekadresse" >
Avatar billede softspot Forsker
10. januar 2006 - 22:32 #3
Noget i stil med dette:

<script type="text/javascript">
var firmainfo = [['firma1','adresse1'],['firma2','adresse2'],['firma3','adresse3']];

function findFirmaInfo(obj) {
  var frm = obj.form;
  for(var i = 0; i < firmainfo.length; i++) {
    if(firmainfo[i][0].toLowerCase() == frm.navn..value.toLowerCase()) {
      frm.adresse.value = firmainfo[i][1];
    }
  }
}
</script>

<form>
  <input type="text" name="navn" onblur="findFirmaInfo(this)"><br>
  <input type="text" name="adresse"><br>
</form>
Avatar billede htx98i17 Professor
10. januar 2006 - 22:32 #4
rettelse:

<script language="javascript" >
           
            function tjekadresse() {
                alert(firma.value());
            }
       
        </script>

<input type="text" name="firma" onchange="tjekadresse()" >
Avatar billede htx98i17 Professor
10. januar 2006 - 22:35 #5
softspot -> det ligner noget af det jeg havde forestillet mig. den kommer godt nok med en fejl. jeg har bare copy/pastet din kode ind i en blank htm-fil og forventet at det virkede hehe :) jeg skriver firma1 og trykker med musen uden for felterne og så kommer den med "et objekt var ventet"
Avatar billede softspot Forsker
10. januar 2006 - 22:37 #6
Ja, sorry - det var utestet og der skal lige lidt HTML omkring koden, men jeg vil godt lige prøve at komme med et mere komplet eksempel...
Avatar billede htx98i17 Professor
10. januar 2006 - 22:38 #7
takker :)
Avatar billede softspot Forsker
10. januar 2006 - 22:40 #8
Sådan der (håber jeg):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
  <head>
    <title>testform</title>
    <script type="text/javascript">
    var firmainfo = [['firma1','adresse1'],['firma2','adresse2'],['firma3','adresse3']];

    function findFirmaInfo(obj) {
      var frm = obj.form;
      for(var i = 0; i < firmainfo.length; i++) {
        if(firmainfo[i][0].toLowerCase() == frm.navn.value.toLowerCase()) {
          frm.adresse.value = firmainfo[i][1];
        }
      }
    }
    </script>
  </head>
  <body>
   
    <form id="Form1" method="post">
      <input type="text" name="navn" onblur="findFirmaInfo(this)"><br>
      <input type="text" name="adresse"><br>
    </form>
   
  </body>
</html>
Avatar billede htx98i17 Professor
10. januar 2006 - 22:42 #9
Det virker i hvert fald. Jeg går ud fra at hvis jeg skal have flere værdier i array'et så er det således:

var firmainfo = [['firma1','adresse1','8000'],['firma2','adresse2','8001'],['firma3','adresse3','8002']];

er det korrekt?
Avatar billede htx98i17 Professor
10. januar 2006 - 22:43 #10
ja det var det :)

men kan man få den til at søge i array'et for hvert bogstav man indtaster? ved godt det ikke var i det oprindelige spørgsmål
Avatar billede softspot Forsker
10. januar 2006 - 22:49 #11
Det er helt iorden, du er i din fulde ret til at spørge ligeså meget du lyster :)

Du kan benytte indexOf til at lave delvise søgninger og du kan bruge substr til bla. at søge på starten af et firmanavn. Eksempler:

    // denne version søger på starten af et firmanavn og returnerer info
    // for den første den finder...
    function findFirmaInfoStart(obj) {
      var frm = obj.form;
      var fnavn = frm.navn.value.toLowerCase();
      for(var i = 0; i < firmainfo.length; i++) {
        if(firmainfo[i][0].substr(0,fnavn.length) == fnavn) {
          frm.adresse.value = firmainfo[i][1];
          return true;
        }
      }
    }


    // denne version søger efter et firmanavn som indeholder teksten
    // og returnerer info for den første den finder...
    function findFirmaInfoLike(obj) {
      var frm = obj.form;
      var fnavn = frm.navn.value.toLowerCase();
      for(var i = 0; i < firmainfo.length; i++) {
        if(firmainfo[i][0].indexOf(fnavn) > -1) {
          frm.adresse.value = firmainfo[i][1];
          return true;
        }
      }
    }

Begge funktioner kan så aktiveres på onkeypress:

<input type="text" onkeypress="findFirmaInfoStart(this)"><br>


Igen så må jeg advare: det er ikke testet...
Avatar billede htx98i17 Professor
10. januar 2006 - 22:52 #12
de virker fint. mange tak for hjælpen. lig et svar :)
Avatar billede softspot Forsker
10. januar 2006 - 22:58 #13
Hmm... der er lige et lille problem med dem (i min browser), for det lader til at det sidste tegn man indtaster ikke bliver taget med i værdien (fordi det ikke er en del af value på det tidspunkt hvor eventet bliver udført). Det betyder at den ikke kan kende forskel på firma1 og firma2 før man indtaster et tegn mere i feltet (f.eks. et mellemrum). Hvordan man laver en crossbrowser løsning er jeg lidt usikker på, men jeg er ret overbevist om at det er noget med at hente det sidste tegn fra event-objektet... hvordan man så får fat i det på en skudsikker måde i de forskellige browsere er jeg straks mere usikker på...
Avatar billede htx98i17 Professor
10. januar 2006 - 23:04 #14
skidt pyt :)

tak for hurtig hjælp. det er næsten som i gamle dage...
Avatar billede softspot Forsker
10. januar 2006 - 23:10 #15
Velbekomme :D

Har lige et par modificerede versioner af funktionerne (der gør søgningen case insensitive i de to nye funktioner). Desuden benyttes der onkeyup i stedet for onkeypress, da den fungerer som den skal - også i FF 1.0:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
  <head>
    <title>testform</title>
    <script type="text/javascript">
    var firmainfo = [['firma1','adresse1'],['firma2','adresse2'],['firma3','adresse3']];

    function findFirmaInfo(obj) {
      var frm = obj.form;
      for(var i = 0; i < firmainfo.length; i++) {
        if(firmainfo[i][0].toLowerCase() == frm.navn.value.toLowerCase()) {
          frm.navn.value = firmainfo[i][0];
          frm.adresse.value = firmainfo[i][1];
          return true;
        }
      }
    }

    // denne version søger på starten af et firmanavn og returnerer info
    // for den første den finder...
    function findFirmaInfoStart(obj) {
      var frm = obj.form;
      var fnavn = frm.navn.value.toLowerCase();
      for(var i = 0; i < firmainfo.length; i++) {
        if(firmainfo[i][0].toLowerCase().substr(0,fnavn.length) == fnavn) {
          frm.navn.value = firmainfo[i][0];
          frm.adresse.value = firmainfo[i][1];
          return true;
        }
      }
    }


    // denne version søger efter et firmanavn som indeholder teksten
    // og returnerer info for den første den finder...
    function findFirmaInfoLike(obj) {
      var frm = obj.form;
      var fnavn = frm.navn.value.toLowerCase();
      for(var i = 0; i < firmainfo.length; i++) {
        if(firmainfo[i][0].toLowerCase().indexOf(fnavn) > -1) {
          frm.navn.value = firmainfo[i][0];
          frm.adresse.value = firmainfo[i][1];
          return true;
        }
      }
    }
    </script>
  </head>
  <body>
   
    <form id="Form1" method="post">
      <input type="text" name="navn" onkeyup="findFirmaInfoLike(this)"><br>
      <input type="text" name="adresse"><br>
    </form>
   
  </body>
</html>


Du kan desuden overveje at slette felternes indhold hvis firmaet ikke findes (det kan du bare gøre ubetinget efter for-sætningen i de forskellige funktioner, da koden kun udføres hvis firmaet ikke findes).
Avatar billede softspot Forsker
10. januar 2006 - 23:11 #16
Tak for point i øvrigt :)
Avatar billede roenving Novice
11. januar 2006 - 13:58 #17
-- og så kunne det blive en anelse mere overskueligt ved at bruge regexps:

F.eks. i Start-tingen:

      var fnavn = new Regexp("^" + frm.navn.value,"i");
      for(var i = 0; i < firmainfo.length; i++) {
        if(firmainfo[i][0].match(fnavn)) {
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