Beiträge von Failix

    Ich habe noch eine Frage zum aktuellen Code aus dem Beispiel in https://jsfiddle.net/m7gb8d3t/1/:


    Wenn man die richtige Antwort wählt, wird der Button "nächste Frage" sichtbar. Klickt man diesen, wird der Zähler i um 1 erhöht (Zeile 82 und 84).


    Ich versuche seit Stunden, den Zähler wieder auf 0 zu setzen, sobald man irgendeine Frage falsch beantwortet, aber es gelingt mir beim besten Willen nicht.


    Derzeit ist es so, dass man bei einer falschen Antwort zwar aus dem Spiel fliegt, aber mit dem erneuten Starten wieder bei der falsch beantworteten Frage landet. Ich hätte es gern so, dass man bei einer falschen Antwort immer das gesamte Spiel von Anfang an wiederholen muss. Und dazu müsste der Zähler i wieder 0 sein.


    Ist das in meinem Beispiel überhaupt machbar?

    Vielen Dank! Mir ist klar, dass gerade an dem generierten HTML-Code noch viel zu vereinfachen ist. Ich werde Deinen Vorschlag ausprobieren und mir auch mal den Tipp mit den Templates genauer anschauen. Ja, es muss darauf hinauslaufen, dass sich nichts wiederholt.


    Hättest Du noch eine Idee zu meinem redundanten Code? Nach Zeile 85 steht noch mal dasselbe wie oben, und das nur, weil ich die Ausgabe einmal vor dem Eventhandler brauche und dann beliebig oft danach. Das kann doch nicht der richtige Weg sein, sagt mein Bauch (während das Hirn blöd mit den Schultern zuckt).

    Hallo zusammen,


    um mein Selbststudium in Javascript voranzubringen, habe ich ein kleines (noch völlig unfertiges) Musik-Quiz erstellt:


    https://jsfiddle.net/m7gb8d3t/1/


    Meine Bitte ist, dass sich erfahrene Anwender meinen JS-Code anschauen und beurteilen, ob irgendetwas völlig anders gemacht werden müsste. Ich weiß, dass der Code nicht optimal ist, aber ich suche in meinem frühen Lernstadium auch noch nicht nach Perfektion – es geht mir eher um prinzipielle Fehler, die ich künftig vermeiden sollte.


    Eine Sache stört mich schon selbst: Der größte Teil des JS-Codes ist redundant – erst zum Initialisieren des Spiels, dann um mit einem Click zur nächsten Frage zu kommen. Das kann nicht der richtige Weg sein, aber ich finde derzeit keine bessere Lösung. Vielleicht habt Ihr ja einen Tipp für mich.


    Danke und Gruß

    Felix

    Ich benutze Opera ... und ich glaube, ich hab's! Ich muss erst "meinen" Button drücken, dann den "Stepper" des Debuggers. Wenn die Funktion einmal durchgelaufen ist, wieder meinen Button, dann den Stepper. Dann funktioniert alles wie gewünscht, prima.


    Ich danke Dir ganz herzlich für Deine Hilfe! Schönen Abend noch ... :)


    Edit: Ich benutze Chrome, nicht Opera.

    Vielen Dank ... ich kapiere nur mal wieder nichts. ;)


    Du schreibst im Kommentar: "Setze auf die folgende Zeile einen Haltpunkt, dann kannst Du dich davon überzeugen." Das habe ich gemacht, ohne dass sich – außer dem blauen Symbol links auf der Zeilennummer – irgendwas geändert hätte. Der Debugger läuft genauso wie vorher, am Breakpoint passiert nichts.


    Gerade lese ich (nach Googeln) bei mediaevent.de: "Nachteile anonymer Funktionen ... Testen und debuggen von anonymen Funktionen ist nicht einfach" Ich habe ehrlich gesagt gerade das Gefühl, dass ich nicht wirklich weiß, was ich tue ...

    Vielleicht verstehe ich auch etwas falsch. Ich hatte zu Beginn meines Videokurses Javascript nur mit Node im Terminal, nicht im Browser. Das Debuggen mit Visual Studio Code funktionierte sehr gut, da alles ausschließlich in der Konsole ausgegeben wurde.


    Mit dem Verwenden von document versagte diese Art des Debuggens, und ich nahm an, dass die Browserkonsole anders reagieren würde, doch verhält sie sich identisch. Hier eine animierte Bildschirmaufnahme:


    html-seminar.de/woltlab/attachment/3196/


    Mit dem Erreichen des ersten document gelangen wir sofort ans Ende des Scripts. Vielleicht ist dieses Verhalten auch völlig normal, ich weiß es einfach nicht.

    Eine Frage ganz anderer Art hätte ich noch: Warum kann ich mein Script weder in Firefox noch in Chrome debuggen? Der Debugger läuft nur bis zum ersten Vorkommen von "document", dann springt er ans Ende des Scripts.


    Dieses Verhalten ist nicht spezifisch für dieses Script, es passiert auch in allen anderen Scripts, die "document" enthalten. Warum ist das so?

    Jetzt hab' ich's verstanden! Ich hab's endlich verstanden! Vielen, vielen Dank!


    Ich hab' ganz am Ende einen zusätzlichen Eventhandler eingebaut. Sobald der Button erneut geklickt wird, hört der Timer auf zu arbeiten, prima. Ob es auch ohne den zusätzlichen Eventhandler geht, probiere ich noch, aber das Ziel ist erst mal erreicht.


    Vielen herzlichen Dank für die Hilfe, ohne die ich definitiv nicht weitergekommen wäre.


    Und für alle, die später mal per Suchmaschine auf diesen Thread stoßen sollten, hier das komplette Dokument:


    Ich kann mich gar nicht oft genug bedanken ... die Kommentare sind extrem hilfreich, und ich habe alles verstanden bis auf die vielleicht wichtigste Aussage:


    Code
    // Timervariable, hier wird die ID des aktuellen Timers
    // gespeichert, wir brauchen sie, um den Timer abbrechen zu können:
    timer;


    Die Konsole sagt mir, dass nach dem ersten Durchlauf die Zahlen 2, 3 und 4 in dieser Variablen stehen, nach dem zweiten Durchlauf 6, 7 und 8. Warum aber keine 1 und keine 5?


    Und was mir völlig unklar ist: Wie kann ich diese Variable nutzen, um den Timer abbrechen zu können? Muss ich dazu noch weiteren Code schreiben?


    Und kann ein Mensch so blöd sein wie ich? ;)

    Ich muss so ehrlich sein zuzugeben, dass ich absolut nichts verstehe. Die gesamte Funktion "doIt" ist mir derzeit noch ein Rätsel, ich begreife beim besten Willen nicht, was sie tut und noch weniger, wie ich damit etwas abbrechen kann.


    Um es mal mit meinen einfachen Worten auszudrücken: Ich dachte, ich könne den Abbruch der verzögerten Funktionen einfach auf den nächsten Mausklick legen, aber das scheint nicht richtig zu sein ...

    Man sieht meinem Code an, dass er von einem Anfänger geschrieben wurde. Gerade als Einsteiger braucht man die konkreten Bezeichnungen dort, wo man gerade schreibt, ohne sich erst an einen Variablennamen erinnern zu müssen. Und für einen Fremden, der sich in diesem Code zurechtfinden möchte, ist es so auch leichter. Aber Bastis Code ist halt viel straffer und dadurch auch wieder übersichtlicher. Lediglich die Variablennamen hätte ich sprechender gewählt.


    Vielen Dank für Deinen Vorschlag für meine Timer. Ich habe den Code hoffentlich richtig eingebaut – hier das komplette Dokument:


    Das Ergebnis: Unverändert zu meiner Version, leider. Alles funktioniert prima, solange mal nicht zu schnell klickt. Ansonsten passiert es, dass nach einen paar sehr schnellen Durchläufen der orangefarbene Button mit der Inschrift "Noch mal!" unter einer beliebigen Frage oder Antwort auftaucht. Man könnte jetzt sagen, dass kein Mensch sowas mit affenartiger Geschwindigkeit durchklicken würde, aber es ist halt ein Bug.


    Ich will Euch nicht Zeit und Nerven rauben; ich übe ja nur und brauche das Dokument für nichts Ernsthaftes. Aber ich freue mich, dass ich mit Eurer Hilfe weiter lernen kann, danke!

    basti1012 Klar kann man Code auf verschiedene Weise schreiben, aber in jedem Fall gilt doch: je kürzer, desto besser. Ich muss mir z. B. angewöhnen, wiederkehrende Schreibweisen in Variablen anzulegen und Variablen, die nur zwei Zustände haben, als Boolean auszuzeichnen. Deine Version meines Dokuments ist wirklich sehr hilfreich für mich.


    Sempervivum Kein Problem, es drängt doch nichts. Du hast bereits sehr geholfen.

    Herzlichen Dank für Deine Mühe! Ich habe mir Dein Dokument aus CodePen gespeichert und kann daraus eine Menge lernen, was die Optimierung des Codes angeht. Wie ich sehe, hast Du eine Intervallfunktion statt der Timeouts benutzt, offensichtlich die viel bessere Lösung.


    Was das clearTimeout in meinem Dokument angeht, stehe ich auf dem Schlauch. Aber vielleicht muss ich das auch gar nicht mehr verstehen, denn ... siehe oben. :)

    Danke Dir für den Tipp! Dass der Code nicht optimal ist, wundert mich nicht – ist meine erste selbstgeschriebene Übung. Daran kann man garantiert noch einiges verbessern.


    Nun aber zu clearTimeout(): Nach meinem Verständnis müsste das durch ein Click-Event ausgelöst werden, also habe ich es so geschrieben:



    Leider, leider hat es keine Auswirkung. Was mache ich falsch?

    Mittlerweile bin ich eigentlich mit dieser Übung fertig ... eigentlich. Ich habe ein Dokument erstellt, in dem alles prima funktioniert – solange man nicht allzu schnell durch die Fragen klickt.


    Klickt man schneller, als meine ab Zeile 145 eingebundenen Timeouts reagieren können, kommen die Formatierungen durcheinander. Meine Frage: Kann man den Timeouts irgendwie sagen, dass sie nicht starten oder ihre Funktion abbrechen sollen, wenn durch zu schnelles Klicken ihre Bedingungen nicht erfüllt werden?


    Hier das Dokument:


    Du bist ja superfix, herzlichen Dank!


    Den Modulo hatte ich vorhin auch schon beim Wickel, aber irgendwie habe ich mich darin verheddert. Ich muss mich mal resetten und neu darüber nachdenken. Gerade Zähler sind für die Fragen zuständig, ungerade für die Antworten. Vielleicht kriege ich es jetzt ja hin ... danke Dir nochmals!


    Ein paar Minuten später: Ich habe Dein Beispiel mit der Statusabfrage eingebaut und es funktioniert hervorragend! Am Kopf kratzend, frage ich mich, warum ich nicht selbst darauf gekommen bin. Es ist ein simpler Umschalter, aber so etwas hatte ich nicht auf dem Schirm.


    Wieder was gelernt heute, das freut mich sehr. Danke, danke, danke! 8)