Array, Objekte, Schleife - einzelne Zeile des Arrays ausgeben?

  • 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. :)

  • Dein Code könnte man auf viele verschiedene Wege schreiben.

    Meiner ist sicherlich auch nicht der beste.

    Auch ist die Frage, ob man Interval oder Timeout nutzen sollte.


    Oder ob man mehrere Timer nutzt, wie du es gemacht hast, oder mit Umwegen mit einem wie ich es gemacht habe.

    Wie gesagt, Wege gibt es viele.

    In Javascript ist Sempervivum der Profi hier.

    Wäre mal schön zu wissen, was er sagt, wie er das machen würde.


    Ich habe einfach mal versucht dein Code so weit zu kürzen , ohne das irgendeine Funktion von dir verloren geht, die du da benutzt.

    In der CSS könnte man auch noch Kleinigkeiten ändern.

    Ich glaube das ich es nicht mehr kürzer hinbekomme, außer mit jQuery

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

  • Zitat

    in jedem Fall gilt doch: je kürzer, desto besser.

    Da stimme ich nur bedingt zu: Abgesehen von Variablen wie i und skurrilen Wettbewerben namens "Codegolfing" ziehe ich Klarheit und Lesbarkeit der Kürze vor, auch wenn es um sprechende Variablennamen geht. Also, wie anfangs vorgeschlagen, eine Status-Variable mit den Werten "zeigeFrage" und "zeigeAntwort" oder wenn man ein boolean nimmt, einen Namen, der angibt, was drin steht, z. B. let zeigeAntwort = false; Ist diese false gilt dann "zeigeFrage".

    Was Klarheit und Lesbarkeit betrifft, ist deine Lösung, Failix aus #17 IMO im Vorteil, weil man sehr schnell erkennt, was Du vor hast. Will man die Timer stoppen, sehe ich jedoch den Nachteil, dass es gleich 4 Timervariablen gibt. Als Alternative zu setInterval und einer Statuskennung möchte ich eine Lösung vorschlagen, die, wie die Fragen und Antworten, auf einem Array basiert:

    (ungetestet)

  • 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!

  • Auf das Problem mit den Timern hatte ich jetzt gar nicht das Augenmerk gerichtet, sondern wollte nur eine Alternative zu der Endphase vorschlagen. Die Timer-ID steht dort in der Variablen timer und damit kannst Du das setTimeout, das jeweils aktiv ist, abbrechen.

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

  • Zitat

    Die gesamte Funktion "doIt" ist mir derzeit noch ein Rätsel, ich begreife beim besten Willen nicht, was sie tut

    Ich werde ein paar Kommentare hinein schreiben, damit es verständlich wird.

    Zitat

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

    Doch, das ist schon richtig. Du hast ja die ID des jeweiligen Timers in der Variablen timer . Dann brauchst Du nur clearInterval aufzurufen, um den Timer zu stoppen:

    Code
    if (timer) {
        clearTimeout(timer);
    }

    Und das kannst Du innerhalb des Eventlisteners für den Klicker tun.

  • Hier das Javascript mit Kommentaren:

    Im Moment habe ich mehrere Aktivitäten laufen, daher habe ich meinen Grundsatz, das was ich poste auch zu erklären, leider zunächst vernachlässigt.

  • 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? ;)

  • 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:


  • 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?

  • Bei mir in Opera funktioniert der Debugger einwandfrei. Sehr sporadisch habe ich das Problem, dass er sich irgend wie verklemmt und ich muss dann den Tab schließen und die Seite neu öffnen oder sogar den Browser neu starten. Aber bei dir scheint ja das Problem dauerhaft zu bestehen.

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

  • Gut, dass Du dieses GIF angehängt hast, daran erkennt man nämlich, dass das ein Missverständnis ist und das Verhalten normal. Es geht ja um diesen Code:

    Ich habe wieder Kommentare hinein geschrieben, nur am Anfang und am Ende, dazwischen wollte ich nicht löschen, um mit den Klammern nicht durcheinander zu kommen.

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

  • Auf meinen Startbutton? Dann bleibt alles am Breakpoint stehen. Beim Fortsetzen steht in der Konsole "[Violation] 'click' handler took 9070ms". Die Funktion arbeitet zwar, aber ich komme im Quellcode nicht über den Breakpoint hinaus.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!