10. maj 2006 - 15:56Der 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.
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".
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.
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.
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 :)).
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.
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.