den grundsätzlichen Aufbau kann ich allerdings nicht ändern, d.h. das inline-JS in einen Callback zu packen o.ä. wird nicht funktionieren
Dieser Aufbau ist aber für das Problem verantwortlich.
Ist klar, aber wie gesagt, den kann ich leider nicht ändern (ist auch nicht auf meinem Mist gewachsen :-).
Wenn du in einem script-Element im <body> jQuery verwenden willst, dann musst du es SYNCHRON davor laden. Mit createElement("script")/appendChild lädst du es jedoch ASYNCHRON. Damit ist natürlich nicht garantiert, dass das externe Script geladen ist, wenn die Scripte im <body> ausgeführt werden.
Wenn du synchron laden willst, verwende ausschließlich document.write. Dann wird das Parsing des Dokuments und damit das Ausführen der Scripte angehalten, bis jQuery geladen und ausgeführt ist.
Du kannst aber m.W. nicht direkt nach document.write() deine Startup-Funktion ausführen. document.write("<script src='...'></script>">) ist nur für darauffolgende Scripte synchron, der Code direkt nach dem document.write-Aufruf hat noch keinen Zugriff auf die Objekte, die im externen Script definiert werden. Bei document.write() ist ein Callback also nicht möglich.
Das ist ein guter Hinweis. Ich habe jetzt mal folgendes versucht:
if (typeof $ == 'undefined')
{
document.write('<script type="text\/javascript" src="jquery-1.4.2.min.js"><\/script>');
document.write('<script type="text\/javascript">startup();<\/script>');
}
else
{
startup();
}
Das funktioniert in FF, Opera, Chrome und Safari. Nur leider mackt der IE6 jetzt rum und behauptet, $ wäre undefined...
Allgemein ist das natürlich ein verbesserungsfähiger Aufbau. Üblicherweise läd man JavaScript-Code aus Performancegründen am Ende des Dokuments, dann völlig asynchron mit Callbacks. JavaScript-Code mitten ins Dokument einzubetten, erschwert die ganze Sache und macht asynchrones Laden mit Callback unmöglich. Das nennt sich Unobtrusive JavaScript.
Ja klar, aber ich hab das wie gesagt nicht in der Hand. Die CMS-Infrastruktur, in die das integriert werden muss, ist so alt und verkorkst, dass es keine Chance gibt, in der Footer-Template festzustellen, welche JS-Dependencies die aktuellen Content-Templates brauchen und mit welchen Parametern die JS-Objekte initialisiert werden müssten
Mathias