Avatar billede sho Nybegynder
10. oktober 2004 - 21:12 Der er 20 kommentarer og
1 løsning

Hjælp til onChange / onLoad

Hejsa eksperter,

jeg har et problem, som I garanteret kan løse...

Lidt simplificeret, så har jeg en formular med et inputfelt og en selectboks. Når brugeren taster noget i inputfeltet og forlader det, skifter selectboksen til værdien af det skrevne. Når brugeren vælger i selectboksen, hopper værdien over i inputfeltet. Ikke så mange ben i det...

Hvis brugeren ønsker at redigere en tidligere indtastet record, så placerer jeg uden problemer værdien i inputfeltet, men nu ønsker jeg, at selectboksen automatisk skifter - på samme måde, som hvis værdien var tastet manuelt af brugeren. Hvordan gør jeg det, uden at skulle ud i en masse overflødig kode?

I pseudokode ser det nogenlunde således ud:

<input type='text' name='Inputfelt' onChange='InputCheck(this.form);' onFocus='this.select();'>
<select name='Selectboks' onChange='SelectCheck(this.form);'>
    <option value='test'>test - Beskrivende tekst</option>
</select>

Jeg troede, at jeg kunne fange en onChange-event, så når værdien af inputfeltet skifter, så kalder den selv det javascript, der skifter indholdet i selectboksen, men det lader til at være sværere end som så, når jeg udfylder det når siden loader.

Giver det nogen mening - og kan I hjælpe?

-Søren
Avatar billede roenving Novice
10. oktober 2004 - 21:21 #1
Hvad med at placere en linje nederst i dit script med InputCheck-funktionen:

<script ...>
function InputCheck(form){

  //...

}
window.onload = function(){InputCheck(document.FORMNAVN);}
</script>
Avatar billede sho Nybegynder
10. oktober 2004 - 21:35 #2
Mine scripts har jeg lagt ud i en .js-fil, så den når aldrig til scriptet, når siden loader ... eller gør den? Der er jo ingen onChange, der kalder den?

Jeg har lige forsøgt mig med

<script language="JavaScript">
    window.onload = function(){
        InputCheck(document.formnavn);
    }
</script>

i <head>-sektionen af siden, men uden held.

Jeg er ingen nørd til javascript, men prøver at bruge min logiske sans. Værdien i input-feltet tildeler jeg med en variabel fra en include-fil, så syntaksen i min HTML-kode er

<input type='text' name='Inputfelt' value='<%=strFormValue%>' onChange='InputCheck(this.form);' onFocus='this.select();'>

Så har inputfeltet vel ingen værdi, når siden loades, har det? Ergo hjælper det ikke at kalde funktionen InputCheck når siden loades?

Det var derfor, jeg troede, at jeg kunne løse det med onChange/blur/focus (eller lignende) som attribut på feltet.
Avatar billede roenving Novice
10. oktober 2004 - 21:40 #3
Hedder din form da 'formnavn' ?-)
Avatar billede roenving Novice
10. oktober 2004 - 21:41 #4
-- og iøvrigt er det ligegyldigt om et script ligger i en ekstern fil, det læses altsammen under opstarten, lidt forsinket, hvis man sætter defer på script-tagget, men det har du vel ikke ?-)
Avatar billede roenving Novice
10. oktober 2004 - 21:42 #5
-- og onload kaldes, når _hele_ siden er loadet !-)
Avatar billede sho Nybegynder
10. oktober 2004 - 21:53 #6
Okay, der blev jeg lidt klogere... :-)

Nej, min form hedder noget andet - jeg har anonymiseret mine variabler, så betragt det som en vis grad af pseudokode. Hvis jeg mailer det direkte til dig, skal du nok få det råt for usødet, men jeg foretrækker at holde et figenblad over min kode, når den er offentligt tilgængelig :-)

Loades hele den eksterne script-fil hver gang? Så det vil sige, at hvis jeg samler hele sitets scripts i én fil for overskuelighedens skyld, så loader samtlige sider samtlige scripts? Det kan man da ikke kalde optimering af performance, men det var en afstikker fra spørgsmålet. Øhh, defer på script-tagget? Og det er?

Hvis onLoad kaldes, når hele siden er loadet, så burde dit første forslag virke, gjorde det ikke? Eller har jeg gjort noget forkert? Kan man sætte onLoad på et inputfelt?
Avatar billede roenving Novice
10. oktober 2004 - 22:03 #7
*lol* -- har du da ikke tænkt dig at udsende dine sider ?-)

Ja, for de funktioner som findes i et eksternt script skal være til rådighed for hele siden, så derfor loader browseren det hele, hvilket dog først vil være et performance-mæssigt problem, hvis du har _mange_ hundrede kilobyte !-)

defer indsat i et script-tag betyder, at browseren ved, at indholdet ikke er direkte afviklelig script-kode, men funktioner, som den ikke behøver at skynde sig at loade, hvorfor den prioriterer resten af siden og loader pågældende script-bid eller -library parallelt ...

Ja, men jeg kan ikke se noget forkert !-)

-- og nej, onload kan kun sættes på tags, som indeholder en src, body (hele siden eller window.onload !-), et img- eller iframe-tag f.eks.
Avatar billede sho Nybegynder
10. oktober 2004 - 22:09 #8
Jo, men jeg har kun tænkt mig at udgive dem som HTML, og desuden kun i et intranet - noget af koden beholder jeg for mig selv... :-)

Hvad er syntaksen for defer i en script-tag, for det kunne jeg da godt se en idé i at eksperimentere lidt med?

Jeg roder lidt mere med det, og så giver jeg lyd fra mig igen...
Avatar billede roenving Novice
10. oktober 2004 - 22:15 #9
<script type="text/javascript" defer> hvis du bruger almindelig html

-- og sandsynligvis, hvis du bruger xhtml:

<script type="text/javascript" defer="defer">
Avatar billede sho Nybegynder
10. oktober 2004 - 22:16 #10
Lyd!

Jeg har lige prøvet at lave stave funktionsnavnet forkert i det kald, som du foreslog, så jeg burde have fået en javafejl, hvis det virkede efter hensigten?

<head>
<script language="JavaScript">
    window.onload = function(){InputCheck(document.formnavn);}
</script>
</head>

giver samme resultat som

<head>
<script language="JavaScript">
    window.onload = function(){InputChe(document.formnavn);}
</script>
</head>

...nemlig slet ingenting..?

Så overvejede jeg i et svagt øjeblik at flytte det ned som onLoad i <body>-taggen, men det er langtfra HVER gang, at jeg ønsker at checke samtlige felter, så det ville give en del overhead.

Hvad gør en klog mand nu?
Avatar billede roenving Novice
10. oktober 2004 - 22:21 #11
Kan ik' li'e se nogen fejl ...

-- men prøv engang at sætte type på script-tagget:

<script type="text/javascript" language="JavaScript">

-- ideen kommer fra, at det er en ret sen javascript-version, som understøtter funktions-tildelinger, så ved at bruge en nutidig angivelse af indholdet, kunne det være, at det virkede !-)

-- og du kan jo prøve at sætte alerts inde i funktionen !-)
Avatar billede sho Nybegynder
10. oktober 2004 - 22:34 #12
Den kommer aldrig ind i funktionen - altså i den, der skulle kalde inputCheck. Er det kun mig, der undrer mig?!?

<head>
<script type="text/javascript" language="JavaScript">
    window.onload = function(){
        alert("STOP")
        InputCheck(document.formnavn);
    }
</script>
</head>
Avatar billede roenving Novice
10. oktober 2004 - 22:38 #13
Jeg måtte da lige se, om det skulle give nogen problemer, men et simpelt check virkede fuldstændigt problemfrit ...

-- og i alle mine browsere !-)
Avatar billede roenving Novice
10. oktober 2004 - 22:39 #14
Hele html-filen så således ud:

<script language="javascript" type="text/javascript">
window.onload = function(){alert('hej');}
</script>
Avatar billede sho Nybegynder
10. oktober 2004 - 22:40 #15
Jeg gider ikke mere i aften, men vender tilbage i morgen ... foreløbig tak for hjælpen... :-|
Avatar billede sho Nybegynder
10. oktober 2004 - 22:49 #16
Nu er jeg blevet lidt klogere... det der ser ud til at forhindre, at jeg når frem til den alert, er indholdet i min <body>-tag. Hvis jeg udelader nedenstående onLad, så virker det upåklageligt... men hvad i nedenstående kan på nogen måde fornærme det andet kald?!? Er det frames, der driller?

onload="document.formnavn.Inputfelt.focus();parent.frames[0].location.reload();parent.frames[3].location.reload();"
Avatar billede roenving Novice
10. oktober 2004 - 22:56 #17
Nej, men den onload overtager jo window.onload !-)

Så kan du vælge at flytte de to funktioner fra body-tagget ind i funktionen eller at sætte den anden ind i body-tagget:

<head>
<script type="text/javascript" language="JavaScript">
    window.onload = function(){
        parent.frames[0].location.reload();
        parent.frames[3].location.reload();
        InputCheck(document.formnavn);
        document.formnavn.Inputfelt.focus();
    }
</script>
</head>

-- eller:

onload="parent.frames[0].location.reload();parent.frames[3].location.reload();InputCheck(document.formnavn);document.formnavn.Inputfelt.focus();"
Avatar billede sho Nybegynder
10. oktober 2004 - 23:02 #18
Hvorfor sagde du ikke det for længe siden? ;-)))

Smid et svar, så får du både point og kommer med i min aftenbøn!!
Avatar billede roenving Novice
10. oktober 2004 - 23:04 #19
Tjah, jeg nævner ganske ofte den problematik, men det havde jeg jo ingen anelse om, kunne være tilføldet her !-)

Velbekomme '-)
Avatar billede roenving Novice
10. oktober 2004 - 23:05 #20
-- og tak for point ;~}
Avatar billede sho Nybegynder
10. oktober 2004 - 23:06 #21
Jeg SAGDE jo, at jeg ikke var særlig velbevandret i javascript, men jeg laver nok ikke dén fejl igen! ;-)

Tak for hjælpen!
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