Hallo,
da ich die einzelnen javascripts aus performancegründen nachgelagert lade und nachträglich in das DOM einfüge kann ich nicht sicher sein, ob die function javascript() schon geladen ist wenn ein user auf den link klickt.
Wenn eine so große Verzögerung zwischen der Anzeige der Seite und dem Laden des Scripts gibt, solltest du zu aller erst versuchen, diese zu minimieren. Zur Not sogar die Scripte blockierend laden.
Üblicherweise registriert man Event-Handler per JavaScript beim DOM-Ready. In dem Fall kann es nicht dazu kommen, dass nicht geladene Handler aufgerufen werden. Es kann natürlich immer noch passieren, dass User schon im Interface klicken, bevor die JavaScript-Logik geladen ist.
ich bräuchte jetzt Hilfe dabei, alle (nicht näher definiert) javascript functionsaufrufe abzufangen und nur auszuführen wenn die function existiert. wenn nicht soll der functionsaufruf in einer Warteschleife geparkt werden.
Das geht nicht ohne den Code zu ändern. Das Aufrufen einer nicht existenten Funktion sorgt für eine Exception. Die kann man zwar abfangen (window.onerror), aber nur sehr unspezifisch.
Eine Funktion zu definieren, die Aufrufe speichert, ist natürlich möglich.
var queue = [];
var callWhenReady = function(name) {
// Lese 1. bis n. Parameter in einen Array
var args = Array.prototype.slice.call(arguments, 1);
// Speichere Namen und Parameter in der Queue
queue.push({ name: name, args: args });
};
Aufruf:
callWhenReady('funktionsname', parameter…);
Dann wie du sagst periodisch prüfen, ob die globalen Funktionen existieren:
var polling = function() {
// Durchlaufe Queue und erzeuge eine neue
queue = queue.[link:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce@title=reduce](function(queue, descriptor) {
// Suche globale Funktion mit dem Namen
var f = window[descriptor.name];
if (typeof f == 'function') {
// Rufe Funktion auf, füge nicht zur neuen Queue hinzu
f.apply(window, descriptor.args);
} else {
// Füge zur neuen Queue hinzu
queue.push(descriptor);
}
return queue;
}, []);
if (queue.length) {
setTimeout(polling, 100);
}
};
polling();
(ungetesteter Beispielcode)
Mathias