Avatar billede webcreator Nybegynder
10. maj 2006 - 15:56 Der er 14 kommentarer og
2 løsninger

Funktion virker kun hvis alert() kaldes først

Hej Eksperter.

Jeg er kommet i en meget underlig situation. Når min side loades, kaldes en initialiserings-funktion - <body onload="func()"> - og dette virker fint. Funktionen ser således ud:

function func()
{
  iniComponents(); // Initialiserer mine komponenter

  getMyData(); // Henter data og tilføjer komponenter
}

Det underlige er, at på trods af at iniComponents() burde initialisere fx mine indtastningsfelter, så kan getMyData() ikke tilføje data til disse. Hvis jeg udkommenterer getMyData(), så kan jeg dog konstatere, at mine komponenter ER blev initialiseret.

Hvis jeg sætter en alert("Hello world"); ind mellem iniCompontents() og getMyData(), så virker den sidstnævnte funktion perfekt. Hvad går der mon galt? Det er (selvfølgelig) kun i Internet Explorer, at det ikke virker.
Avatar billede webcreator Nybegynder
10. maj 2006 - 16:28 #1
Et simpelt eksempel der viser problemet :
http://powerzone.dk/editor/index_simple.html
Avatar billede razmuz_dk Nybegynder
10. maj 2006 - 16:42 #2
Virker det hvis du skriver...
setTimeout("getMyData();", 100);
i stedet?

... det lyder som om dine indtastningsfelter ikke er "færdig-initialiseret" når getMyData køres.

Nu ved jeg ikke lige hvad iniComponents() og hvordan du initialiserer, men i nogle tilfælde ville det virke hvis du flytter getMyData(); til det sted i koden hvor iniComponenets() er "færdig".
Avatar billede webcreator Nybegynder
10. maj 2006 - 16:47 #3
Jo, det virker med setTimeout. Men er ideen med onLoad eventet ikke netop, at det først fyres af når alle elementer af siden er hentet og genereret?
Avatar billede softspot Forsker
10. maj 2006 - 17:34 #4
I det eksempel du henviser til, ser det ud til at den kode der kopierer værdien fra form-feltet over i RTE er udkommenteret...?
Avatar billede webcreator Nybegynder
10. maj 2006 - 17:42 #5
Ja, men det var lige i forbindelsen med noget debugging jeg var i gang med.

Egentlig tror jeg også man skal adskille tingene. Onload afvikles når hele dokumentet er genereret. Men det betyder ikke, at IE ikke kan være i gang med at arbejde på de elementer dokumentet består af. Man kunne meget vel tænke sig, at det kræver en del arbejde, at omdanne et iFrame til en RichEdit boks (specielt fordi IE er i stand til at omdanne stortset alt til en sådan). Og hvis det foregår i en separat tråd, så kan det problem jeg oplever opstå.

Det er blot mit bud - ved ikke om der er hold i det.
Avatar billede webcreator Nybegynder
10. maj 2006 - 18:10 #6
Hm, faktisk tror jeg ikke det har noget som helst med tid at gøre.Selv med 1 milisekund, fungerer det.
Avatar billede webcreator Nybegynder
10. maj 2006 - 18:12 #7
Måske forcer vi IE til at lave et internt trådskifte eller lignende. Men det er jo ikke til at vide med Closed Source :)
Avatar billede razmuz_dk Nybegynder
11. maj 2006 - 08:42 #8
Hehe, i så fald ser jeg tre veje at gå herfra:
1) Brug Firefox :-)
2) Sæt den ned til 1 milli-sekund
3) Forsæt debugging

Hvis du ikke allerede bruger det så er der en glimrende javascript-konsol med i Firefox, som fortæller dig hvor js-fejl opstår.
Avatar billede langthjem Nybegynder
11. maj 2006 - 08:48 #9
Umiddelbart lyder det jo ikke som om der opstår direkte fejl, men jeg har dog en mulig løsning til dig.
Du skal sætte din iniComponents() til at returnere true når den er færdig, og så kan du styre det sådan her:

function func() {
    if (iniComponents()) {
        getMyData();
    }
}

På den måde udføres begge, men getMyData() bliver ikke affyret før iniComponents() returnerer en værdi.
Avatar billede softspot Forsker
11. maj 2006 - 09:08 #10
Det tror jeg ikke vil fungere, da initComponents jo vil udføres på samme måde som hidtil, blot med et ekstra statement, nemlig return true - det ændrer efter min bedste overbevisning ikke det faktum at der er noget som ikke når at blive færdig sammen med initComponents-funktionen.

Et andet forslag er at du implementerer et "trial"-system i getMyData, som undersøger om editorobjektet er i den ønskede tilstand inden du tildeler værdien til innerHTML. Hvis editor-objektet ikke er i den ønskede tilstand, så sætter du et timeout der kalder funktionen igen efter x millisekunder som forsøger igen (husk at lave en failsafe, så du ikke ender i en uendelig løkke af timeout-kald :)).
Avatar billede langthjem Nybegynder
11. maj 2006 - 11:15 #11
Jeg mener jo at man kunne finde ud af hvilken funktion der er den sidste i iniComponent() til at blive udført og få den til at returnere dér ... det ville forudsætte at det hele er i den ønskede tilstand inden getMyData() udføres.
Avatar billede webcreator Nybegynder
05. september 2006 - 12:20 #12
Tak for svar alle. Jeg må hellere se at få lukket. Smider I nogle svar?
Avatar billede razmuz_dk Nybegynder
05. september 2006 - 12:26 #13
Flaf!
Avatar billede softspot Forsker
05. september 2006 - 13:38 #14
Ingen point til mig, for dette spørgsmål - ellers tak :)
Avatar billede langthjem Nybegynder
05. september 2006 - 16:44 #15
Fluf!
Avatar billede langthjem Nybegynder
26. oktober 2006 - 18:04 #16
Hvad blev din løsning?
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