PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ausführungsreihenfolge mehrerer <script>s


ethrandil
2007-04-09, 20:25:34
Hallo,

wir schreiben gerade eine webapplikation mit scriptaculous. Wir haben im HTML-Dokument etwas wie:


<script src="/static/jscript/prototype.js" type="text/javascript"></script>
<script src="/static/jscript/scriptaculous.js" type="text/javascript"></script>
<script src="/static/jscript/main.js" type="text/javascript"></script>
<script src="/static/jscript/unser_script.js" type="text/javascript"></script>


Allerdings kommt es zu sporadischen Fehlern beim Pagereload (zumind. in firefox 1.5).
Es gibt fehler, wie

Ajax.InPlaceEditor is not a constructor
behaviour(div.image_thumb)unser_script... (line 10)
reload(Object name=.image_thumb)main.js (line 22)
apply()main.js (line 15)
onload()account (line 23)
[Break on this error] callback: function(form, value) { return 'name=' + escape(value) }


Builder is not defined
behaviour(a#category-name-12.category-name private)unser_script... (line 20)
reload(Object name=#categorytree .category-name)main.js (line 22)
apply()main.js (line 15)
onload()account (line 16)
[Break on this error] (elmt.up('.category-div')).appendChild(Builder.node('img', {src:'/static/e...

Wir führen diese Fehler darauf zurück, dass unser Skript vor den scriptaculous-scripten ausgeführt wird und darum die Typen noch nicht definiert sind. Diese stehen aber im quellcode vor unseren!
Kann das überhaupt sein? Und kann man das umgehen?

mfg
- eth

Gast
2007-04-10, 13:43:30
wann wird dein script ausgeführt?

grundsätzlich sollten alle scripte erst nach vollständigen laden aller dateien ausgeführt werden.
also erst per onload im body dein script ausführen lassen.
nicht irgendwo im dokument einfach mal so....
das klappt meistens nicht richtig.

ethrandil
2007-04-11, 00:34:11
In diesem speziellen Fall wird in der vierten <script>-Einbindung eine Variable definiert, die die Klasse Ajax.InPlaceEditor aus einem vorherigen <script> braucht.

Verstehe ich es richtig, dass das fehleranfällig ist und wir sowas erst mit window.onload() (bzw <body onload="">) machen dürfen?

- eth

Gast
2007-04-11, 16:16:26
leider richtig.

browser können mehrere dateien gleichzeitig laden.
und das tun sie auch.
wenn ein link zu einer externen datei auftaucht fängt der browser an diese zu laden.
wenn die maximale anzahl gleichzeitig zu ladender dateien erreicht ist werden die weiteren dateien in eine liste gestellt und dann der reihe nach geladen.
da mehrere files gleichzeitig geladen werden kann es passieren dass das laden zwar in der richtigen reihenfolge begonnen wird,
aber niciht in der richtigen reihenfolge beendet wird.
d.h. eine datei die der browser zwar später lädt kann früher im speicher sein.
einfach weil der server diese schneller ausliefert als die erste.
oder weil diese einfach kleiner ist als die erste und deswegen schneller geladen wurde.
das sind zumindest die offensichtlichen gründe.
es ist leider noch nicht mal garantiert dass ein browser die externen dateien in der reihenfolge lädt in der sie in der html-datei erscheinen.
es ist also leider so dass man auf funktionen, variablen oder sonsitges aus externen skripten grundsätzlich erst dann zugreifen sollte wenn wirklich alles geladen wurde.