twb: Javascript wird nicht geladen

problematische Seite

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.

akzeptierte Antworten

  1. problematische Seite

    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.

    1. problematische Seite

      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.

      1. problematische Seite

        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

        --
        Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
        - Douglas Adams, The Hitchhiker's Guide To The Galaxy
    2. problematische Seite

      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();
      }
      
      1. problematische Seite

        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.

        1. problematische Seite

          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();
          }
          
          1. problematische Seite

            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...

  2. problematische Seite

    http://thomasweibel.ch/manesse-gammon/backgammon.html

    Fehlende Übersetzung?

    Bis demnächst
    Matthias

    --
    Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
    1. problematische Seite

      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.

    2. problematische Seite

      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.

      1. problematische Seite

        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:

        • Auf HTML5 umstellen, damit Du künftig weniger Arbeit hast (siehe das dann obsolete, fingergelenkverschleißende und tippfehleranfällige type="javascript".
        • Die Funktion preloadImages() umbenennen.

        Dann ist auch eine schöne Referenz.

        1. problematische Seite

          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.

      2. problematische Seite

        @@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 🖖

        --
        “There’s no such thing as an ‘average’ user, but there is such a thing as an average developer.” —Vitaly Friedman in Accessibility Matters: Meet Our New Book, “Inclusive Design Patterns”
        Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
        1. problematische Seite

          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!