Beiträge von Sempervivum

    Mir scheint, die Erklärung ist folgende: Du berechnest die Höhe des roten Divs ja mit Javascript und das steht direkt vor dem schließenden </body> und wird sofort ausgeführt, nachdem das HTML eingelesen wurde. Das ist normaler Weise vollkommen OK, nur hier ist es so, dass Du diese Schriftart "Noto Sans JP" von extern lädst. Das dauert einen kurzen Moment und offenbar wird das Javascript ausgeführt, bevor die Schrift vollständig geladen ist und daher wird die Höhe dieser Schrift nicht berücksichtigt. Dies dürfte sich beheben lassen, indem Du das Javascript erst im load-Event ausführst, dann sollte sicher gestellt sein, dass alle externen Dateien vollständig geladen sind.

    Vielleicht interessiert es den einen oder anderen: Ich bin da auf ein cooles Feature von Javascript gestoßen, das ich bisher noch nicht kannte: Mit dem Schlüsselwort yield kann man nach für nach Werte aus einem Array abholen und dazwischen etwas anderes erledigen ohne dass die Schleife sofort bis zum Ende durchrast. Weder MDN noch SelfHTML noch w3schools haben es mir verständlich gemacht aber hier bei Stackoverflow ist es ganz gut erklärt:

    https://stackoverflow.com/questions/2282…d-in-javascript

    Meine Demo zum Ausprobieren und Verstehen:

    Man muss beachten, dass dies mit forEach nicht funktioniert, siehe hier:

    https://stackoverflow.com/questions/2931…-inner-function

    Der Code an sich scheint mir richtig zu sein, nur dieser Kommentar:

    Zitat

    // Hier wird eine Funktion definiert, die einen Wert zurückgeben soll:

    ist IMO missverständlich: Unter "einen Wert zurückgeben" versteht man i. allg. dass die Funktion einen Rückgabewert mit der return-Anweisung zurück gibt. Das ist jedoch hier nicht der Fall sondern die Funktion, die als callback übergeben wurde, wird aufgerufen und der Wert als Parameter übergeben.

    Code
    // Der Fehler liegt hier: Da Du innerhalb der Funktion doSomethingElse auf ids zugreifst,
    // musst Du dies als Parameter definieren:
    // function doSomethingElse() {
    function doSomethingElse(ids) { 
        console.log(ids);
    }

    Verwirrend könnte sein, dass hier keine Rede von dem Parameter ist:

    Code
    getCountRows(doSomethingElse);

    Da in der Funktion getCountRows jedoch die Funktion mit diesem Parameter aufgerufen wird, funktioniert das trotzdem:

    Code
    callback(ids);

    Das Beispiel, das Du da gefunden hast, ist schon Mal sehr gut. Angewendet auf deine Zeilenanzahl müsste das dann in etwa so aussehen:

    Vorteil: Das Ganze ist etwas aufgeräumter, weil die einzelnen Bestandteile in Funktionen aufgeteilt wurden.

    Nachteil: Die Reihenfolge, in der die Funktionen aufgerufen werden, ist nicht mehr ganz so offensichtlich.

    Du hast vollkommen Recht, etwas zu duplizieren ist fast immer eine unschöne Lösung. Und die Standard-Alternative ist, den Code in eine Funktion zu packen und diese mehrfache aufzurufen. Was die Sache hier ein wenig kompliziert macht, ist die Tatsache, dass die Abfrage der Anzahl der Fragen asynchron abläuft, d. h. Du kannst nicht einfach im then einen Return machen, um den Wert zurück zu liefern. Aber es gibt eine Lösung: Der Funktion eine Callback-Funktion als Parameter übergeben, in der die Aktionen stehen und diese dann im then-Zweig aufrufen. Versuche es auf diesem Wege und wenn Du nicht zum Ziel kommst, melde dich wieder.

    Zitat

    Wie kann das sein? & Wie kann ich die ganzen Container auf die komplette Höhe strecken?

    Du hast zwar html und body auf die volle Höhe gestreckt, aber was fehlt ist eine Anweisung, die dem main-Container sagt, dass er die volle Höhe ausfüllen soll:

    Code
    main {
        display: flex;
        flex-direction: row;
        height: 100%;
    }

    Davon abgesehen ist IMO ist der main-Container überflüssig, denn body ist für Styling nicht tabu. Außerdem wäre es konsequent, statt der Maße in Prozent die Flex-Anweisungen zu verwenden. Dann könnte das CSS so aussehen:

    Ja, Du kannst den Code auch komplett auslagern aber dann muss Du die script-Tags und die Zeilen mit den Kommentarzeichen <!-- //-->

    weg lassen. Ich hoffe, Du hast sie bisher nicht drin. Nur das was ich in Posting #3 gepostet habe, in die js-Datei. Der Browser weiß schon durch das Einbinden mit dem Script-Tag, dass es sich um Javascript handelt.

    Du hast jetzt die Skript-Tags verschachtelt. Erst die Daten einbinden und dann den Rest:

    Code
    <script src="data.js" ></script>
    <script> 
    /** Ab hier nichts mehr ändern! **/ 
    var num = Math.random(); 
    var ran = Math.floor((image.length - 1) * num) + 1; 
    document.write('<div id="zahl1">' + link[ran] + '</div><div id="nichtmarkieren"><img src="' + image[ran] + '" border="0" /></div></a>'); 
    </script>

    (type, language und die Kommentarzeichen braucht man heute nicht mehr.)

    Da sehe ich zwei Hauptprobleme:

    1. Ein überflüssiges span-Tag innerhalb des Label. Dadurch überlappen sich die Labels.

    2. Eine ID muss auf der Seite eindeutig sein. Daher wirkt ein Klick auf das zweite Label auf den ersten Inhalt. Du musst für jedes Label-Input-Paar eine eigene ID verwenden.

    Davon abgesehen ist nav und ul für den Inhalt, der aufgeklappt wird, wenig angebracht. Besser z. B. ein section-Tag und den Inhalt darin mit Überschrift und Abschnitten strukturieren.

    Da das Javascript-Syntax ist, kannst Du diesen Code auch in eine js-Datei auslagern und mit dem script-Tag einbinden. D. h. die komplette Definition der beiden Arrays:

    in eine Datei, z. B. data.js schreiben, ohne script-Tags, und mit diesem Code einbinden:

    Code
    <script src="data.js"></script>

    Was Du da beschreibst stimmt genau mit dem überein was ich im Javascript sehe:

    (Kommentare habe ich hinzu gefügt)

    Es sollte machbar sein, das Hintergrundbild aus dem data-Attribut mit CSS so einzurichten, wie Du es brauchst.

    "Trying to access array offset on value of type bool in /users/music-quiz/www/animalgame3.php on line 21"

    liegt i. allg. daran, dass eine Funktion false statt eines Arrays liefert, weil bei der Ausführung ein Fehler aufgetreten ist. Siehe z. B. die Doku von fetch:

    https://www.php.net/manual/de/pdostatement.fetch.php

    Um heraus zu finden, was für ein Fehler kannst Du auch die SQL-Fehler anzeigen lassen, siehe hier:

    https://www.php.net/manual/de/pdostatement.errorinfo.php

    Ohne dies zu sehen, scheint mir aber, dass diese Zeile überflüssig ist:

    $statement->execute(array($choosen));

    Du willst ja den Datensatz auslesen, wo die ID passt und dieses $choosen ist etwas anderes als die ID.