Warten bis Frame geladen?
chris
- javascript
hi!
ich habe 2 frames. wobei in einem frame ein hidden-field ist. wenn nun die seite geladen wird, dann fragt der untere frame im oberen frame den wert des hidden-fields ab.
nun passiert es manchmal, dass der frame mit dem hidden-field noch nicht geladen ist. somit passiert ein JavaScript-Fehler (logischerweise), da der untere frame auf ein feld im oberen zugreifen will, das noch gar nicht da ist
(mit --> var anz=top.Navigation.a_Datensatzanzahl.value).
Navigation ist der name des oberen frames.
wie kann ich nun dem unteren frame sagen, dass er solange warten soll und erst die abfrage machen soll, wenn der obere frame vollstaendig da ist (geladen ist).
p.s.: das hidden-field in den unteren frame packen will ich nicht (hat andere gruende)
DANKE!
mfg, chris
hi!
ich habe 2 frames. wobei in einem frame ein hidden-field ist. wenn nun die seite geladen wird, dann fragt der untere frame im oberen frame den wert des hidden-fields ab.
nun passiert es manchmal, dass der frame mit dem hidden-field noch nicht geladen ist. somit passiert ein JavaScript-Fehler (logischerweise), da der untere frame auf ein feld im oberen zugreifen will, das noch gar nicht da ist
(mit --> var anz=top.Navigation.a_Datensatzanzahl.value).
Navigation ist der name des oberen frames.
wie kann ich nun dem unteren frame sagen, dass er solange warten soll und erst die abfrage machen soll, wenn der obere frame vollstaendig da ist (geladen ist).
p.s.: das hidden-field in den unteren frame packen will ich nicht (hat andere gruende)
DANKE!
mfg, chris
Hi Chris...
Du benutzt doch bestimmt eine JavaScript-Funktion, die diesen Wert dann ausliest...
Also starte die Funktion doch im onload des Frames mit dem Hidden-Feld...dann müsste das Feld ja immer da sein.
Gruss,
Skrymer
Also starte die Funktion doch im onload des Frames mit dem Hidden-Feld...dann müsste das Feld ja immer da sein.
hi Skrymer!
der vorschlag funktioniert leider nicht, da ich in dieser funktion eben, durch den wert im hidden-field, auch objekte im anderen frame bearbeite und somit es auch manchmal vorkommen kann, dass wiederum der untere frame länger mit dem laden braucht.
ich brauche also unbedingt eine variante, wie ich in einem frame auf das laden des 2-ten warten kann.
aber danke für dienen vorschlag!!
mfg, chris
Also starte die Funktion doch im onload des Frames mit dem Hidden-Feld...dann müsste das Feld ja immer da sein.
hi Skrymer!
der vorschlag funktioniert leider nicht, da ich in dieser funktion eben, durch den wert im hidden-field, auch objekte im anderen frame bearbeite und somit es auch manchmal vorkommen kann, dass wiederum der untere frame länger mit dem laden braucht.
ich brauche also unbedingt eine variante, wie ich in einem frame auf das laden des 2-ten warten kann.
aber danke für dienen vorschlag!!
mfg, chris
Ok....wenn ich also nochmal zusammenfassen darf, müssen beide Frames geladen sein, damit die Funktion ausführbar ist....
Dazu würde mir spontan folgendes einfallen:
Du siedelst Dein Script auf Frameset-Ebene an. In diesem Script deklarierst Du 2 Boolsche Variablen isFrameALoaded, isFrameBLoaded (Vorschlag des Verfassers...:-)), die standard mässig auf false gesetzt sind. Jedes Frame feuert beim onload eine Funktion, die die jeweilige Variable auf true setzt.
Gleichzeitig mit dem Frameset startest Du Deine Funktion, die das Hiddenfeld abruft, aber vorher die beiden Variablen prüft. Sind beide true, kannst Du die Funktion ausführen, sind sie es nicht, ruft sich die Funktion eben nochmal selbst auf. (Achtung Schleifen-Gefahr!!!)
Weiss jetzt nicht genau, ob das die super elegante Lösung ist...ist bestimmt noch ausbaufähig, aber vom Prinzip her sollte es doch funzen, oder???
Probier´s mal aus...und sag bescheid, ob es gefunzt hat. Interessiert mich nämlich jetzt selber!
Gruss,
Skrymer
Sind beide true, kannst Du die Funktion ausführen, sind sie es nicht, ruft sich die Funktion eben nochmal selbst auf. (Achtung Schleifen-Gefahr!!!)
die Idee ist gut - funktioniert auch grundsätzlich.
nur ruft sich die funktion so oft selbst auf, dass am ende nur mehr der DR.WATSON mit einem Überlauf meldet und sich der explorer verabschiedet.
gibt es im ie eine möglichkeit zu warten (z.B. etwas wie wait(millisekunden). dann könnte ich jedes mal, wenn entdeckt wird, dass die seite noch nicht geladen ist ein zeit warten (bis der frame geladen ist - dürfte aber kein wait sein, dass den ganzen explorer stoppt, damit er mit dem frameladen noch fortfahren kann) und es danach nochmal versuchen. dann würde die funktion sich nicht so oft selbst aufrufen, sodass ein überlauf passiert.
ist zwar nicht schön, aber so könnte es funktionieren.
danke nochmal für deine bemühungen!!!!!!
mfg, chris
hi Chris...
hehe...der erste Versuch ging also voll in die Hose....naja...
Du kannst mit setTimeout den Aufruf einer Funktion um eine gewisse Zeit (in Millisekunden) verzögern.
die Syntax ist setTimeout("funktion()",millisek);
http://selfhtml.teamone.de/javascript/objekte/window.htm#set_timeout
Grundsätzlich ist die Lösung mit setTimeout aber nicht so gut, da Du ja nie weisst, wie lange die Seite zum Laden braucht.
Klar...wenn die Datei ganz klein ist, kann es natürlich nicht ewig dauern, aber Du weisst es eben nie genau....
Gruss,
Skrymer
hi Skrymer!
sieht so aus als hätten wir die idee mit setTimeout zur selben zeit gehabt. sie meinen thread um "20. 03. 2002, 12:33 Uhr" steht irgendwo in der mitte, deiner um "20. 03. 2002, 12:34 Uhr" - cool was.
ich war um eine minute schneller :-)
danke dir nochmals für deine tatkräftige unterstützung!!!
mfg, chris
moin
Sind beide true, kannst Du die Funktion ausführen, sind sie es nicht, ruft sich die Funktion eben nochmal selbst auf. (Achtung Schleifen-Gefahr!!!)
die Idee ist gut - funktioniert auch grundsätzlich.
nur ruft sich die funktion so oft selbst auf, dass am ende nur mehr der DR.WATSON mit einem Überlauf meldet und sich der explorer verabschiedet.
gibt es im ie eine möglichkeit zu warten (z.B. etwas wie wait(millisekunden). dann könnte ich jedes mal, wenn entdeckt wird, dass die seite noch nicht geladen ist ein zeit warten (bis der frame geladen ist - dürfte aber kein wait sein, dass den ganzen explorer stoppt, damit er mit dem frameladen noch fortfahren kann) und es danach nochmal versuchen. dann würde die funktion sich nicht so oft selbst aufrufen, sodass ein überlauf passiert.
Tsss tsss tsss :-)
Was machst nen da mit ner Schleife? und setTimeout() ist böse...
var FrameOben = false;
var FrameUnten = false;
bei einem onload() Event eines Frames setzt du den entsprechenden Wert auf true (wie schon erläutert). Zusätzlich ruft du eine Funktion auf.
function check() { if(FrameOben == true && FrameUnten == true)beidegeladen();}
Da du zwei Frames hast wird function check() zweimal aufgerufen. Beim ersten Aufruf wird einer der beiden Werte natürlich noch false sein und nix geht. Der zweite Aufruf wird aber deine gewünschte Funktion auslösen.
cu
:-))
jo....da hat er vollkommen recht...*stirnklatsch*
und schon wieder was dazugelernt...
es grüsst,
Skrymer
Hi,
Da du zwei Frames hast wird function check() zweimal
aufgerufen. Beim ersten Aufruf wird einer der beiden
Werte natürlich noch false sein und nix geht.
Der zweite Aufruf wird aber deine gewünschte Funktion
auslösen.
wie sicher bist Du, daß das ordentlich serialisiert wird?
Die HTTP-Übertragungen beider Frames laufen immerhin quasiparallel ... nicht, daß am Ende die Funktion zweimal erfolgreich ausgeführt wird ...
Viele Grüße
Michael
hi!
ich hab das problem jetzt folgendermaßen irgendwie und auch nicht sehr schön gelöst - aber es funktioniert :-)
ich habe einfach in der funktion, die von onLoad aufgreufen wird ein --> setTimeout("myFunction();", 600); gemacht. in myFunction() wird alles gemacht was nötig ist - myFuntion() wird somit erst nach 600 millisekunden aufgerufen. das ist genug zeit, damit der obere frame geladen wird und auch der untere und alle info drinnen steht.
vielleicht gibts da ja was besseres - aber ich weiß im moment nicht anderes.
mfg, chris
hi!
ich hab das problem jetzt folgendermaßen irgendwie und auch nicht sehr schön gelöst - aber es funktioniert :-)
ich habe einfach in der funktion, die von onLoad aufgreufen wird ein --> setTimeout("myFunction();", 600); gemacht. in myFunction() wird alles gemacht was nötig ist - myFuntion() wird somit erst nach 600 millisekunden aufgerufen. das ist genug zeit, damit der obere frame geladen wird und auch der untere und alle info drinnen steht.
vielleicht gibts da ja was besseres - aber ich weiß im moment nicht anderes.
mfg, chris
genau das hab ich unten gemeint...:-)
Problem ist halt, wenn sich aus irgendeinem bescheuerten Grund die Ladezeit verlängert, kann es eben sein, dass das setTimeout vorbei ist, wenn die Datei wider Erwarten noch nicht geladen ist.
In den meisten Fällen funzt es, aber 100 % sicher wird es nicht sein...
Gruss,
Skrymer
hi,
warteschleife einrichten:
var max = 10; // maximale Versuche
var cnt = 0;
function tu_was() {
if(top.framename && top.framename.document.formname) alert("feddich");
else if(cnt < max) {
cnt++;
setTimeout('tu_was()',300);
}
}
Gruesse Joachim