Avatar billede hrole Mester
14. november 2008 - 15:06 Der er 22 kommentarer og
1 løsning

Forms og onchange (måske)

Hej,

Jeg har følgende form:
<form id="navn" name="navn" method="get" action="resultat.php">
    <input name="navn" type="text" id="navn" />
<select name="by" id="by">
<option value="%">Alle</option>
<option value="Ebeltoft">Ebeltoft</option>
<option value="Skagen">Skagen</option>
<option value="Berlin">Berlin</option>
</select>
<select name="land" id="land">
<option value="%">Alle</option>
<option value="Danmark">Danmark</option>
<option value="Tyskland">Tyskland</option>
</select>
<input type="submit" name="Search" id="Search" value=" Søg " />
<input type="reset" name="slet" id="slet" value=" Slet " />
</form>

Formen bliver senere udvidet med flere byer og lande.

Det jeg kunne tænke mig var at ved valg af Danmark vises KUN byer i Danmark, og ved valg af Tyskland KUN byer i Tyskland osv.
Jeg har på fornemmelsen jeg skal bruge onchange, men kan ikke gennemskue det.
Avatar billede Slettet bruger
14. november 2008 - 15:22 #1
Det kan godt laves med en onchange, men det vil højest sandsynligt være et lidt større script end du nok lige regner med.

Det jeg ville gøre er at et array med lande, for hvert land laver du så et array igen med byer fra landet.

ex:
var arr_lande = new Array("Danmark","Norge","Sverige","Tyskland");
// Byer for Danmark
var arr_byer[0] = new Array("København","Aarhus","Odense","Aalborg");

Hvis du har fået fat i idéen i systemet.

Så når du vælger land, skal der køres en ONCHANGE() der looper det passende array igennem og enten udskriver vha. "appendChild" metoden, eller simpelthen laver hele html koden og udskriver det til et element igennem "document.getElementById(element-id).innerHTML"

Lad mig give et eksempel:

// Din HTML Form
<select name="land" onchange="hentByer(this.id)">
  <option value="0">Danmark</option>
  <option value="1">Norge</option>
  <option value="2">Sverige</option>
  <option value="3">Tyskland</option>
</select>

// JavaScript funktionen "hentByer(id,maal)"
function hentByer(id,maal) {
  // Her angiver vi en variabel til det passende BY array
  var byArray = arr_byer[id];
 
  // Her looper vi så array'et igennem og gemmer byerne i én string
  var byString = "<select name=\"byer\">";
  for(i=0; i<byArray.length; i++) {
    byString = byString + "<option value=\"" byArray[i] + "\">" + byArray[i] + "</option>";
  }
  byString = byString + "</select>";

  // Looper er færdigt, så vi putter vores string med alle byerne ind i et element
  document.getElementById("vis_byer").innerHTML = byString;
}


// Din HTML Side
<span id="vis_byer"></span>



Prøv det af, det er kun et eksempel, ikke testet af, men skulle give dig en idé til en måde du kan gøre det på.. det måske ikke den nemmeste eller smarteste, men burde virke :-)
Avatar billede Slettet bruger
14. november 2008 - 15:24 #2
hov, jeg kan allerede se 2-3 fejl jeg lavede i scriptet...

  <select name="land" onchange="hentByer(this.id)">
skal ændres til
  <select name="land" onchange="hentByer(this.id,'vis_byer')">

og
  document.getElementById("vis_byer").innerHTML = byString;
skal ændres til
  document.getElementById(maal).innerHTML = byString;


så burde det forhåbentligt virke.
Avatar billede Slettet bruger
14. november 2008 - 15:25 #3
Arhg, for helvete da jeg sover jo max...

der hvor jeg har skrevet "this.id" skal være "this.value"
ellers får du ikke rigtig noget data ind i dit javascript...
Avatar billede hrole Mester
14. november 2008 - 17:40 #4
ja, det var noget mere end jeg regnede med. jeg prøver det lige igennem.

Kan det gøres lettere i php evt.?
Avatar billede Slettet bruger
14. november 2008 - 17:56 #5
At begynde at koble JavaScript og PHP sammen er nok bare mere forvirrende.
Og i sidste ende er det præcis samme kode der skal laves i PHP hvis det var.
Men altså prøve selve idéen i systemet af, og så må du jo bare sætte det op efter hva der behager dig.

Held og lykke med det.
Avatar billede w13 Novice
14. november 2008 - 18:16 #6
Det skal laves på stort set præcis samme måde i PHP, så det bliver koden ikke mindre af. Derudover kan man ikke køre PHP-koder  uden at loade siden igen, med mindre man bruger JavaScript (AJAX), og så får du for alvor en stor kode.

JavaScript kan naturligvis ikke regne ud, hvilke byer der er danske eller tyske, medmindre du fortæller den det, ligesom Roxki gør med nogle Arrays, så det kan ikke være meget anderledes.

Og så synes jeg i øvrigt, Roxkis kode er meget lille i betragtning af, hvad det skal klare, så det er nok den bedste løsning. Især hvis du fjerner kommentarerne, så kan du se, hvor få kommandoer, der er.

Min eneste indvending er dog, at jeg klart ville fraråde brugen af innerHTML og i stedet foreslå, at koden brugte gyldige DOM-metoder, såsom f.eks. appendChild, som Roxki selv foreslår. Det giver et par linjer ekstra kode, men din kode bliver valid, og du vil kunne bruge den under XHTML også - med meget få modifikationer.
Avatar billede w13 Novice
14. november 2008 - 18:16 #7
innerHTML derimod vil overhovedet ikke kunne virke under XHTML 2.0, når browserne engang understøtter det.
Avatar billede Slettet bruger
14. november 2008 - 19:32 #8
Det har du helt ret i w13, men hvis den kode jeg skrev virker stor og forvirrende, ved jeg ikke helt om jeg selv ville springe ud i appendChild og lign. kommandoer, da jeg selv syntes det er noget mere indviklet at arbejde med end bare at generer en alm. html kode og smide den ind i med innerHTML ;o)
På den anden side, kan man lige så godt lærer det nyeste og bedste fra starten, og så slipper man jo nok med nogle læretimer i længden!
Avatar billede olebole Juniormester
15. november 2008 - 01:35 #9
<ole>

Ja, DOM er 'det nyeste' af de to, men ikke mere end et års tid yngre end innerHTML (små 10 år), så det er vist på tide at få det lært  ;o)

/mvh
</bole>
Avatar billede roenving Novice
15. november 2008 - 10:44 #10
-- og et simpelt eksempel som ligner roxkis kraftigt kan ses i denne tråd: http://www.eksperten.dk/spm/615326 !-)
Avatar billede hrole Mester
15. november 2008 - 11:55 #11
Jeg er i tvivl om hvor jeg skal placere

<span id="vis_byer"></span>
Avatar billede w13 Novice
15. november 2008 - 12:00 #12
Der hvor byernes select-boks skal vises, når man har valgt land. =)
Avatar billede hrole Mester
15. november 2008 - 12:13 #13
Sådan?:
<td>Bynavn:</td>
<td><select name="Bynavn"  id="Bynavn">
<span id="vis_by"></span>
</select></td>

Viser ingen byer.
Avatar billede w13 Novice
15. november 2008 - 12:17 #14
Nej, selve <select ...> og </select> bliver også indsat i span'en og det er iøvrigt helt umuligt at smide en span ind i en select.

<td>Bynavn:</td>
<td>
<span id="vis_by"></span>
</td>

Det er i hvert fald sådan, jeg har forstået roxki's kode, men nu ved jeg jo heller ikke, om han har testet den.
Avatar billede hrole Mester
15. november 2008 - 12:22 #15
hmm, virker ikke
Avatar billede w13 Novice
15. november 2008 - 12:24 #16
Ok, så er der vel en fejl i koden.

Går ikke ud fra, der er nogle fejlmeddelelser, siden du ikke nævner nogen?
Avatar billede w13 Novice
15. november 2008 - 12:24 #17
Heller ikke i FireFox's fejlkonsol?
Avatar billede hrole Mester
15. november 2008 - 12:45 #18
Jo, det gik lidt for hurtigt.

Fejlen er i første linie herunder:
<select name="land" onchange="hentByer(this.id,'vis_byer')">
  <option value="0">Danmark</option>
  <option value="1">Norge</option>
  <option value="2">Sverige</option>
  <option value="3">Tyskland</option>
</select>
Avatar billede w13 Novice
15. november 2008 - 12:47 #19
Fejlen kunne måske være this.id, når selecten ikke har noget id. :)

Læg lige id="land" på selecten også.

Ellers skal jeg bruge fejlbeskeden også og ikke kun linjenr. =)
Avatar billede hrole Mester
15. november 2008 - 12:55 #20
Jeg fandt fejlen, en lille tastefejl.

Point til roxki for koden, og mange tak for andres input.
Avatar billede w13 Novice
15. november 2008 - 13:08 #21
Hvad var fejlen så?
Avatar billede hrole Mester
15. november 2008 - 13:15 #22
Jeg havde selv lavet en tastefejl da jeg tilføje i koden.
Avatar billede Slettet bruger
16. november 2008 - 02:50 #23
Det var så lidt hrole, håbede også du fik fat i alle mine små ændringer jeg opdagede efter jeg fik skrevet selve koden.
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