Du kan hente en XML fil med postnumre og byer hos postdanmark. Filen kan importeres til en database, og herefter er det blot at lave et system der slår op i databasen og returnerer den by der hører til det indtastede postnummer
du kan f.eks. reagere på onchange-eventet på et tekstfelt, som kalder en rutine der enten via AJAX eller via en iframe henter data fra serveren.
Alternativt kan du sende alle postnr og bynavn-informationer med over til klienten i et objektstuktur som genereres på serveren, så du slet ikke behøves beskæftige dig med at forbinde til serveren når der er behov for et bynavn.
Det var også lidt sådan jeg havde tænkte det "Alternativt kan du sende alle postnr og bynavn-informationer med over til klienten i et objektstuktur som genereres på serveren, så du slet ikke behøves beskæftige dig med at forbinde til serveren når der er behov for et bynavn." men ved ikke hvordan amn gør, har du et script eller et link til et sted hvor man kan finde informationer?
postnrtabel.asp læser så postnr og bynavne fra dit XLS-dokument eller databasen (alt efter hvad du ønsker). Output af postnrtabel.asp kunne være noget i stil med dette (den skal naturligvis fyldes ud med alle postnr og bynavne):
Jeg vil fraråde at alle postnumre læses ind i en object struktur, ud fra den betragtning at du oftest kun skal bruge et postnummer. Derved sparer du en masse loadtid hos brugeren og på serveren ved kun at hente det du har behov for.
Ved at hente alle data skal serveren hente alle data og skrive disse i et object. Dette objekt skal herefter sendes over netværket til brugeren. Når brugeren modtager det, skal der søges efter informationer i objektet, og dette skal præsenteres for brugeren.
Ved kun at hente det du har behov for, skal serveren kun hente én record (eller flere hvis der indtastes flere på en gang), og herefter sende de data tilbage du skal bruge. Klienten skal ikke bruge tid på at søge i det modtagne, men kan præsentere det direkte for brugeren.
I dette tilfælde vil jeg mene du kan spare både computerkraft på serveren og klienten, og du sparer netværkstid.
Det er en klassisk situation at afgøre om det er bedst at spare netværkstid eller computer kraft.
En anden faktor er hvor ofte du har behov for denne feature på klienten. Hvis det er noget der skal bruges ofte, kan det måske alligevel betale sig at sende strukturen ud på klienten (den den kan caches der og dermed ikke skal loades hver gang siden loades).
Der vil jeg mene det er bedst kun at hente det nødvendige, da brugeren typisk blot vil indtaste sit postnummer én gang. De kan selvfølgelig komme til at taste forkert, men alt andet lige sparer du computer kraft og tid ved kun at hente det postnummer brugeren har indtastet
lav en asp side, der tager et postnummer med som parameter i URL. - kaldes fx med get_postnr.asp?nr=2000.
Siden skal fortolkes som en JavaScript side, så derfor skal du have Response.ContentType="text/js" i din fil.
Denne side skal via et SQL kald finde den tilhørende by, og derefter sætte en JavaScript variabel lig den by du henter.
Filen kunne være noget lig følgende (det er ikke testet, så der kan forekomme fejl, og der er ikke validering på. Husk at check om der er en parameter med, om den er et tal etc) ============================ <%@ LANGUAGE = "VBScript" %> <% Response.ContentType="text/js"
cn.Open(DSN) 'åbn database connection Set rs = cn.Execute("SELECT by FROM postnumre WHERE postnummer = " + Request.QueryString("nr")) 'find byen 'tag det første resultat - der bør ikke være mere end et. 'byTxt er feltet i din kode, hvor byen skal stå %> document.getElementById("byTxt").value="<%=rs("by")%>"; <%
Ovenstående benytter et tesktfelt i din kode, der kaldes byTxt, hvor bynavnet skal stå - du kan kalde det hvad du vil, blot koden ændres til det.
For at kalde koden, skal du fortælle browseren at den skal hente et JavaScript. Det kan du gøre ved at benytte følgende kode: =================================== function loadFile(file) { var scriptTag = document.getElementById('loadScript'); var head = document.getElementsByTagName('head').item(0) if(scriptTag) head.removeChild(scriptTag); script = document.createElement('script'); script.src = file; script.type = 'text/javascript'; script.id = 'loadScript'; head.appendChild(script) } =================================== Koden gør i princippet det, at den tilføjer et script element til din side, der kalder en defineret fil. For at kalde dette script, skal du have noget lignende følgende i din form:
================================= <input type="text" name="postTxt" value="" onBlur="java script:loadFile('get_postnr.asp?nr='+this.value)"> <input type="text" name="byTxt" value=""> ================================= Når der mistes focus på postTxt kaldes loadFile med den side der skal hentes + det postnummer der er indtastet. ASP siden sætter derefter værdien i byTxt til by navnet.
Der kan selvfølgelig leges med at disable byTxt så brugeren ikke selv kan skrive i det, men for at gøre det, skal du huske at åbne feltet inden du selv skriver i det fra dit skript, og derefter disable det igen.
Ups - glemte lige at input elementerne skal have ID'er der svarer til deres navne for at ovenstående virker, så det skal være <input type="text" id="postTxt" name="postTxt" value="" onBlur="java script:loadFile('get_postnr.asp?nr='+this.value)"> <input type="text" id="byTxt" name="byTxt" value="">
Det er måske stadig en idé at bibeholde opdatering af bynavn på onchange, så der kun hentes data når der rent faktisk bliver ændret i data - apropos optimering af resurseforbrug.
Det er derfor at der benyttes en onBlur, så der først hentes data når brugeren er færdig med at indtaste i postnummer feltet, og går væk fra det. Hvis onchange benyttes vil den blive fyret afsted hver gang brugeren indtaster/sletter et nummer i feltet, og det vil skabe flere requests samt gøre det mere besværligt at validere, da man i princippet skal tage højde for om brugeren er færdig med at indtaste etc.
Hvis du har en reference til noget god dokumentation der argumenterer for ikke at benytte JavaScript i event routiner vil jeg være meget interesseret i det, for indtil videre har jeg ikke fundet noget negativ dokumentation om emnet, og det er altid godt at revurdere sin opfattelse af tekniker :-)
I princippet er mit forslag det samme der sker når man laver de meget fancy mouseover effekter der var højeste mode i tidernes morgen. I dem sker det blot uden udvikleren selv skal lave routinerne.
Desuden er det samme principper der benyttes i AJAX, hvilket jo for tiden er det eneste rigtige at benytte hvis man spørger alle dem der er med på noderne (hvilket vil sige alle andre end undertegnede) :-)
ang. onchange: nej, den fyrer først bår brugeren forlader feltet og kun hvis der er ændret i feltet, onblur fyrer hver gang man forlader feltet - uanset om der er ændret eller ej.
ang. javascript-prologen: min reference er roenving, jeg har ikke selv læst det, men jeg stoler blindt på en af roenvings kæpheste ;-)
AJAX: det er ganske givet ret genialt, det eneste jeg er lidt forbeholden overfor er kompatibilitet, men jeg skal absolut ikke være den der er fortaler for at bremse udviklingen fordi der sidder en lille flok brugere som ikke kan finde ud af at opdatere deres browsere... :)
Sorry - du har ret! det er onchange der skal benyttes istedet... har åbenbart placeret mit hovede et sted uden lys ;-)
Jeg giver dig medhold i det er fornuftigt at høre efter hvad roenving siger, men indtil jeg har noget dokumentation der kan overbevise mig beholder jeg min holdning :o)
Og så lige din kommentar om AJAX - jeg kan kun være enig. Men sådan er det når noget bliver et buzzword - så skal alle benytte det (selvom det har kunnet lade sig gøre i mange år efterhånden)
Hvilken værdi vil du gerne have skrevet i by feltet? Linien document.getElementById("byTxt").value="<%=rs("by")%>"; skulle allerede gerne skrive i feltet...
Jeg er ikke helt med. ASP siden skulle allerede skrive i value feltet, så der skulle ikke være grund til at hive noget over. ASP siden der bliver kaldt, bliver afviklet som en JS fil, og derfor skulle den gerne snakke direkte sammen med din side, og feltet skulle derved gerne blive skrevet.
Der er ikke taget højde for ikke eksisterende postnumre i koden, så det kan være kaldet til scriptet fejler på serveren. Prøv evt. at indsætte en dummy-tekst i det tilfælde at postnr ikke findes.
<%@ LANGUAGE = "VBScript" %> <% Response.ContentType="text/js"
cn.Open(DSN) 'åbn database connection Set rs = cn.Execute("SELECT by FROM postnumre WHERE postnummer = " + Request.QueryString("nr")) 'find byen 'tag det første resultat - der bør ikke være mere end et. 'byTxt er feltet i din kode, hvor byen skal stå if not rs.eof then %> document.getElementById("byTxt").value="<%=rs("by")%>"; <% else %> document.getElementById("byTxt").value="Ikke fundet"; <% end if rs.close cn.Close 'luk database connection %>
Det er fordi det du ser i kildekoden er den kode som loades når siden hentes fra serveren - den ændrer sig ikke dynamisk sammen med den bagvedliggende DOM - desværre. Så skal du bruge andre værktøjer (jeg har hørt at FireFox har en DOM inspector, men det er vist ikke noget IE har som standard).
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.