Hallo an alle,
wie macht ihr das:
In einem größeren Projekt sollen einige JavaScript-Initialisierungsfunktionen immer aufgerufen werden, andere nur auf bestimten Seiten.
Den Handlermechanismus zum Aufklappen der Hauptnavigation (auch für IE), den brauche ich z.B. immer und initialisiere diesen immer. Die Handler für die Imagemap auf der Seite mit einer Deutschlandkarte, bei der beim Überfahren mit der Maus das Bild immer durch eine Variante mit entsprechend gehighlighteten Bundesländern ausgetauscht werden soll oder das Script, das sicherstellt, dass die Sitemap auch im IE einigermaßen gut dargestellt wird, brauche ich aber nur auf einzelnen Seiten und will es auch nicht immer einbinden.
Bisher mache ich das so, dass ich abfrage, ob eine entsprechende Initialisierungsfunktion überhaupt verfügbar ist und rufe sie auch nur dann auf.
Also etwa so:
window.onload = function () {
generalInit();
if(window.highlightMapInit) highlightMapInit();
if(window.siteMapInit) siteMapInit();
}
Das heißt aber natürlich, dass ich in jedem Dokument des gesamten Projekts diese Funktionen versuchsweise (mit "if") aufrufe. Irgendwie behagt mir das nicht und kommt mir "quick and dirty" vor. Bei sehr vielen Einzelseiten im Projekt, die einer speziellen Initialisierungsfunktion bedürfen, wird so vielleicht auch mal eine vergessen.
Nun ist mir auch noch diese Idee gekommen: Ich bastele mir seitenspezifisch eine Onloadfunktion als String zusammen und lasse diese onload über eval() ausführen:
window.onload = function () {
eval(onloadString);
}
if(!window.onloadString)
window.onloadString = "";
onloadString += "generalInit();";
// an ganz anderer Stelle im Dokument, davor oder danach:
if(!window.onloadString)
window.onloadString = "";
onloadString += "highlightMapInit();";
// an ganz anderer Stelle im Dokument, davor oder danach:
if(!window.onloadString)
window.onloadString = "";
onloadString += "siteMapInit();";
Das hat ja auch den Vorteil, dass ich diesen String an jeder Stelle im Dokument erweitern kann; den für die Imagemap z.B. in einem SCRIPT-Block nach dem MAP-Element, in dem auch die Funktion "highlightMapInit()" definiert wird.
Nun wird ja aber eval() oft als "evil" gescholten. Welche Methode haltet ihr für die bessere, die performantere? Gibt es noch andere Möglichkeiten? Vielleicht bin ich auch nicht der erste, der die Variante mit "eval()" erfunden hat und es wurde an anderer Stelle schon diskutiert. Ich habe aber bei einer ersten oberflächlichen Suche nichts gefunden.
Gruß Gernot