Avatar billede Slettet bruger
14. november 2005 - 10:21 Der er 9 kommentarer og
1 løsning

Udfyld et felt og få den til at hente det over i et andet felt

Hej eksperter, jeg har brug for et script der gør at når jeg har udfyldt <input type="text" name="postnr" maxlength="4" /> at den så henter fra databasen, og sætter det ind i <input type="text" name="by" readonly />, har bare brug for det script der skal trække noget ud, og hvordan det sætter ind.
Avatar billede softspot Forsker
14. november 2005 - 11:38 #1
Vil du have bynavnene liggende på klienten, eller vil du over på serveren for at hente bynavne i en database...?

En ren klientløsning ville i det mindste kræve at du sender alle bynavnene med over hver gang (eller i det mindste første gang, hvis du f.eks. putter dem i en separat js-fil og klienten eller cacher).

Hvis dit by-array har flg. format:

var postnrtabel = [['5000','Odense C'],['6000','Kolding'],['7000','Fredericia']];


så kunne du f.eks. lave en funktion (som du f.eks. placerer sammen med postnrtabellen) der bliver kaldt når postnr mister fokus (onblur):

function findBynavn(e, bykontrolnavn) {
  if(e) {
    var postnr = e.value;
    var byctl = e.form.elements[bykontrolnavn];
    if(byctl) {
      for(var i=0; i < postnrtabel.length; i++) {
        if(postnrtabel[i][0] == postnr) {
          byctl.value = postnrtabel[i][1];
          break;
        }
      }
    }
  }
  return true;
}


og det skal altså bruges således:

<form>
  <input type="text" name="postnr" maxlength="4" onblur="findBynavn(this,'by')" />
  <input type="text" name="by" readonly />
</form>
Avatar billede Slettet bruger
14. november 2005 - 12:14 #2
Jeg ville hente bynavnene fra en database.
Avatar billede Slettet bruger
14. november 2005 - 12:19 #3
Nej det der er fint nok.
Vi brygger selv lidt videre på den, og tak for hjælpen... lægger du lige et svar?
Avatar billede softspot Forsker
14. november 2005 - 12:33 #4
Ja, det får du her :)
Avatar billede Slettet bruger
14. november 2005 - 13:15 #5
men hvis du alligevel gad at svare på hvis man skulle trække fra en database, ville det da ikke gøre noget :D
Avatar billede softspot Forsker
14. november 2005 - 19:26 #6
Hmmm... det må næsten være noget med at du skal submitte formularen på postnr-kontrollens onchange-event. Noget i stil med dette:

<script type="text/javascript">
function findBynavn(e) {
  if(e) {
    var frm = e.form;
    if(frm) {
      frm.submitmode.value = "findBynavn";
      frm.submit();
    }
  }
  return true;
}
</script>

<form method="post">
  <input type="hidden" name="submitmode" value="" />
  <input type="text" name="postnr" maxlength="4" onchange="findBynavn()" />
  <input type="text" name="by" readonly />
</form>


På serveren skal du så finde bynavnet til det postnr som ligger i request.form("postnr"), under den forudsætning at request.form("submitmode") = "findBynavn"...

Eksempel:

<%
postnr = request.form("postnr") & ""
bynavn = ""
submitmode = request.form("submitmode") & ""

if submitmode = "findBynavn" then
  'TODO: åben databasen
  'TODO: find bynavnet til det postnr som ligger i request.form("postnr"), f.eks.:
  sql = "SELECT bynavn FROM postnrtabel WHERE postnr = '" & request.form("postnr") & "'"
  set rs = conn.execute(sql)
  if not rs.eof then
    bynavn = rs("bynavn")
  end if
  rs.close
  conn.close
end if
%>
<form method="post">
  <input type="hidden" name="submitmode" value="" />
  <input type="text" name="postnr" maxlength="4" onchange="findBynavn()" value="<%=postnr%>" />
  <input type="text" name="by" value="<%=bynavn%>" readonly />
</form>
Avatar billede roenving Novice
14. november 2005 - 19:28 #7
-- og det kan gøres langt mere effektivt med et associativ array:

var postnrtabel = {'5000':'Odense C','6000':'Kolding','7000':'Fredericia'};

function findBynavn(e, bykontrolnavn) {
  if(e) {
    var postnr = e.value;
    var byctl = e.form.elements[bykontrolnavn];
    if(byctl && postnrtabel[postnr]) {
      byctl.value = postnrtabel[postnr];
    }
  }
}

-- og hvis man skal opbygge arrayet fra database, bliver det sådan noget lignende:

var postnrtabel = new Array();
postnrtabel['5000'] = 'Odense C';
postnrtabel['6000'] = 'Kolding';
postnrtabel['7000'] = 'Fredericia';

//osv.
Avatar billede olebole Juniormester
14. november 2005 - 19:31 #8
<ole>

Et objekt er laaaaangt hurtigere at søge i - og det bliver slankere end et multidimensionelt array:

var postnr = {p5000:"Odense C",p6000:"Kolding",p7000:"Fredericia"};
Så kan du kalde med:

function findBynavn(e, bykontrolnavn) {
  if(!e) return false;
  var key = "p" + e.value;
  var byctl = e.form.elements[bykontrolnavn];
  if(!byctl) return false;
  byctl.value = postnr[key];
}

En anden vigtig ting er at forkorte alle forekomster af 'København' til 'Kbh' - og 'Frederiksberg' til 'Frb'. Det sparer rigtig mange bytes, når objektet skal downloades  :)

/mvh
</bole>
Avatar billede olebole Juniormester
14. november 2005 - 19:32 #9
roenving >> ikke 'rene' tal som indentifiers i et objekt  ;o)
Avatar billede roenving Novice
14. november 2005 - 19:59 #10
Argh, jeg fokuserede bare på den ekstremt dårlige performance ,-(
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