Javascript wird nicht geladen
twb
- javascript
0 Google weiß alles0 Matthias Apsel
Liebe alle - in meinem neuesten Projekt bin ich auf ein eigenartiges Problem gestossen. Anlässlich des zweiten Schweizer Kultur-Hackathons habe ich ein Projekt realisiert, das darin bestand, eine Illustration der mittelalterlichen Manesse-Liederhandschrift interaktiv zu machen. Die Illustration zeigt zwei Männer beim Backgammon-Spiel, und ich habe in diese Malerei aus dem Hochmittelalter hinein ein funktionsfähiges Backgammonspiel integriert. Das Game wird von einer kleinen KI angetrieben, die ich bereits vor einigen Jahren in Javascript geschrieben habe.
Die Home-Seite des Projekts enthält Informationen über die Handschrift und diese eine Illustration; ein Klick auf das Bild oder den Play-Button führt zur eigentlichen, aus Gründen der Narration in Mittelhochdeutsch gehaltenen Gameseite thomasweibel.ch/manesse-gammon/backgammon.html (die ich hier nicht direkt verlinken kann, weil das SELFHTML-Forum eine fehlende Übersetzung beanstandet). Unterhalb des Spielfelds finden sich die spielwichtigen Buttons Neu, Pass, Undo und Quit (von links).
Solange sich der Spieler an die Navigation via Buttons hält, funktioniert alles in allen getesteten Browsern (Firefox Win, Edge Win, Firefox Linux, Chromium Linux, Safari iOS und Chrome iOS). Erzwingt man aber einen Reload der Gameseite mittels F5 oder Reload-Button, wird das Skript nicht mehr geladen (Fehler tritt auf in FF Win 47.0.1 und in FF Linux 47.0), und die Seite bleibt bis auf den Spielhintergrund leer. Eigenartigerweise zeigt die Javascript-Konsole keinerlei Fehler an, und auch ein Codecheck via JSHint ergibt keinen Fehler. Für hilfreiche Tipps bin ich sehr dankbar.
Da load und reload zwei durchaus verschiedene "Sachen" sind würde ich, gerade weil keiner in die Konsole meckert, bei
<body onload="preloadImages()">
ansetzen. Vielleicht kommt statt
<body onload="preloadImages()">
<div id="canvas"></div>
<div id="screen"><noscript><p>Enable Javascript to play Manesse Gammon</p></noscript></div>
</body>
etwas wie:
<body>
<div id="canvas"></div>
<div id="screen"><noscript><p>Enable Javascript to play Manesse Gammon</p></noscript></div>
<script>
preloadImages();
</script>
</body>
einfach besser.
Ohne dass dieses was mit dem Problem zu tun hat: ware ein Funktionsname wie init_sonstwas() nicht schlauer? preloadImages() ist nicht gerade naheliegend wenn man nur das JS-File anschaut. Eine Funktion dieses Namens ist verbreitet für das Cachen noch nicht gezeigter Bilder zuständig.
Treffer - herzlichen Dank! Ich habe den Eventhandler im <body>-Tag entfernt und am Seitenende
<script type="text/javascript">
preloadImages();
</script>
eingefügt. Auch wenn ich den Grund nach wie vor nicht kenne - jetzt läuft das Skript auch bei Reload bzw. Force Reload in Firefox.
Hallo,
Treffer - herzlichen Dank! Ich habe den Eventhandler im <body>-Tag entfernt und am Seitenende
<script type="text/javascript"> preloadImages(); </script>
eingefügt. Auch wenn ich den Grund nach wie vor nicht kenne - jetzt läuft das Skript auch bei Reload bzw. Force Reload in Firefox.
das klingt durchaus glaubwürdig, weil es wohl unter bestimmten Umständen vorkommt, dass das load-Event im Firefox nicht feuert, wenn das Dokument aus dem Browser-Cache und nicht frisch vom Server geholt wird.
So long,
Martin
Ohne dass dieses was mit dem Problem zu tun hat: ware ein Funktionsname wie init_sonstwas() nicht schlauer? preloadImages() ist nicht gerade naheliegend wenn man nur das JS-File anschaut. Eine Funktion dieses Namens ist verbreitet für das Cachen noch nicht gezeigter Bilder zuständig.
Eigentlich tut preloadImages() ja genau das, nicht?
function preloadImages() {
imageNumber=0;
images=['eins.jpg','zwei.png','drei.png','siebzehn.gif'];
// Prevent game from starting while images are loading
picture=[];
for (i=0;i<images.length;i++) {
picture[i]=new Image();
picture[i].onload=checkPreload;
picture[i].src=images[i];
}
}
function checkPreload() {
// Count images in cache, start game when preload is complete
imageNumber++;
if (imageNumber==images.length) setupGame();
}
Eigentlich tut preloadImages() ja genau das, nicht?
Ja. Aber nicht nur:
preloadImages() {
...
picture[i].onload=checkPreload;
...
}
function checkPreload() {
...
setupGame();
...
}
Also mir gefallen diese Verkettungen nicht. Ich würde lieber mit setupGame()
starten und von dort das preloadImages()
anschieben ...
Zumal ja setupGame() scheinbar ungewollt mehrfach (für jedes vorgeladene Bild) stattfindet. Ich weiß es nicht genau, bezweifle aber, dass dieses Deinem Plan entspricht.
Zumal ja setupGame() scheinbar ungewollt mehrfach (für jedes vorgeladene Bild) stattfindet.
Nein. setupGame() wird nur einmal angeworfen. Zwar läuft checkPreload() nach jedem vorgeladenen Bild ab, aber dabei wird nur die Variable imageNumber hochgezählt. Erst wenn sämtliche Bilder vorgeladen sind,
if (imageNumber==images.length)
wird setupGame() gestartet.
function checkPreload() {
imageNumber++;
if (imageNumber==images.length) setupGame();
}
Zumal ja setupGame() scheinbar ungewollt mehrfach (für jedes vorgeladene Bild) stattfindet.
Nein. setupGame() wird nur einmal angeworfen.
Ach so. Ja. Klar.
Aber Du siehst an meinem Fehler, was die ungünstige Funktionsverschachtelung für Irrtümer erregen kann...
Fehlende Übersetzung?
Hab ich jetzt auch nicht gesehen. Aber wenn man das http[s]:// weglässt, dann reagiert der Linksetzer merkwürdig. Also soweit man "gar nicht" mit "merkwürdig" beschreiben will.
Fehlende Übersetzung?
Jein. Ja - das Dokument ist (ich weiss, wie idiotisch das klingt) in Mittelhochdeutsch gehalten, und das lang-Attribut kennt das Sprachenkürzel "mhd" nicht. Nein - die mittelhochdeutschen Sprachausgaben sind per Tooltip ins Englische übersetzt.
Danke trotzdem: Tatsächlich hatte ich nämlich als Dokumentsprache "en" angegeben, was natürlich falsch ist (korrigiert auf "de"). Im übrigen ist das Problem gelöst.
Im übrigen ist das Problem gelöst.
Ja. Ich stehe ja mangels einer Teilnahme am Programm nicht im Verdacht auf die Bonusmeilen zu schielen, aber es wäre erfreulich würde des sich durchsetzen, den Beitrag mit der Lösung als "akzeptierte" Lösung zu markieren oder in der Antwort etwas wie "Danke" oder "Gelöst" als Subjekt zu setzen, damit es sofort erkennbar wird. Jeder, der es macht ist ein "beispielgebendes Vorbild".
Da das Problem nun gelöst ist:
ToDo:
type="javascript"
.Dann ist auch eine schöne Referenz.
Ja. Ich stehe ja mangels einer Teilnahme am Programm nicht im Verdacht auf die Bonusmeilen zu schielen, aber es wäre erfreulich würde des sich durchsetzen, den Beitrag mit der Lösung als "akzeptierte" Lösung zu markieren
Yep. Done.
- Auf HTML5 umstellen, damit Du künftig weniger Arbeit hast (siehe das dann obsolete, fingergelenkverschleißende und tippfehleranfällige
type="javascript"
.
Ist schon länger geplant, aber, weil noch (D)HTML 4, nach wie vor noch Fingergelenke zerfetzend.
@@twb
das lang-Attribut kennt das Sprachenkürzel "mhd" nicht.
In Angabe der Sprache in HTML findest du den Verweis „Verwenden Sie die Sprachkürzel aus dem IANA-Register für Sprachkürzel.“
Wenn du darin nach „German“ suchst, findest du den Eintrag:
Type: language
Subtag: gmh
Description: Middle High German (ca. 1050-1500)
Added: 2005-10-16
Hätteste auch noch einfacher haben können. Wikipedia: Mittelhochdeutsch, Sprachcodes in der Tabelle rechts.
LLAP 🖖
sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
Subtag: gmh
Tatsächlich! Ein mittelhochdeutscher Sprachcode für Webseiten schien mir derart abseitig, dass ich nicht im entferntesten auf den Gedanken gekommen bin, nachzusehen... Korrigiert. Danke!