Mehrere window.onloads verketten
J. Hofer
- javascript
Hallo,
ich hab hier ein kleines Problem, was ich irgendwie nicht in den Griff bekomme.
Ich habe drei JavaScript Dateien, die alle einen window.onload-Event-Handler haben.
Die brauche ich auch, auch in drei Dateien, da es möglich sein soll, jederzeit eins raus zu nehmen oder ein viertes hinzuzupacken. Die Webseite soll komplett ohne JavaScript funktionieren und ich will nach dem Laden der Seite ihr ein paar Usability Features hinzufügen.
Ich habe sowas versucht:
temp = window.onload;
counter = 0;
window.onload = function() {
if(typeof temp == "function" && counter == 0) {
counter++;
temp();
}
zusaetzlicheFunktion();
}
Will sagen: Ich speichere mir den aktuellen window.onload-Event zwischen, weise dann dem window.onload eine neue function zu, in dieser frage ich ab, ob meine temp-Var eine function ist, wenn ja, führe ich sie einmal aus und führe danach meine zusätzliche Funktion aus.
Das klappt soweit ganz gut.
Nur leider nur mit zwei Scripten. Wenn ein drittes hinzukommt, führt er das Script vom ersten nicht mehr aus.
Egal wieviele Scripte ich einbaue, immer nur die letzten beiden werden ausgeführt.
Komme ich da in eine zu große Rekursionschleife? Mozilla meckert aber nie rum, er führt halt einfach die ersten nicht aus :-(
Jemand eine Ahnung, wie man window.onloads verketten kann? Oder ne Ahnung, wie ich das sauber debuggen könnte, um den Fehler zu finden?
Für Hilfe wäre ich echt dankbar.
Viele Grüße,
Jörn
Halihallo J.
Will sagen: Ich speichere mir den aktuellen window.onload-Event zwischen, weise dann dem window.onload eine neue function zu, in dieser frage ich ab, ob meine temp-Var eine function ist, wenn ja, führe ich sie einmal aus und führe danach meine zusätzliche Funktion aus.
Nur leider nur mit zwei Scripten. Wenn ein drittes hinzukommt, führt er das Script vom ersten nicht mehr aus.
Egal wieviele Scripte ich einbaue, immer nur die letzten beiden werden ausgeführt.
Das klingt logisch, denn:
Die temp Variable ist global. Falls zwei Scripte dieselbe Variable
benutzen, wird der Wert aus dem ersten Script überschrieben. Dein
window.onload Backtick führt also die lokal definierte
zusaetzlicheFunktionen() aus und dann den Backtick des vorher
geladenen Scriptes, aber der Backtick des erstgeladenen Scriptes
wurde ja aufgrund der gleichen Variablenbenennung überschrieben.
Lösungsansatz #1:
Versuche der temp-Variablen Script-lokalen Charakter (Scope) zu
verschaffen:
var temp=window.onload;
...
ggf. funktioniert es damit, oder...
Lösungsansatz #2:
Verwende ein "superglobales Array", indem du die Funktionsbackticks
speicherst:
Dies steht in *jedem* deiner Scripte:
if (typeof window.onloadBacktickQueue=="undefined") {
window.onloadBacktickQueue=new Array()
}
var zusaetzlicheFunktionen = function() {
// der Inhalt deiner jetztigen zusaetzlicheFunktionen()
}
window.onloadBacktickQueue.push(zusaetzlicheFunktionen);
window.onload=function() {
while (var zf=window.onloadBacktickQueue.pop()) {
zf(); // zusaetzlicheFunktionen() aller Scripte ausführen.
}
}
sollte so in der Form in etwa funktionieren, habe jetzt gerade keine
Zeit meine Vorschläge und Ideen zu testen.
Viele Grüsse
Philipp