Beiträge von Sempervivum

    Gern. Der Browser arbeitet die Datei von oben nach unten ab. Das Javascript greift hier:

    Code
    $("#val").on("change", function () {

    auf das Input mit der ID "val"

    und hier:

    Code
    $(selector).each(function (idx, ele) {

    auf das Canvas mit der ID "display" zu. Steht das Javascript im Head, hat der Browser die Zeilen wo diese Elemente definiert werden, noch nicht abgearbeitet und sie sind deshalb undefiniert.

    Es kommt zu keiner Fehlermeldung, weil z. B. $("#val") dann ein leeres Array liefert.

    Dann vermute ich folgendes: Da ich im body kein Skript sehe, nehme ich an, dass Du das Javascript in den head eingetragen hast. Dann gibt es das Problem, dass dort die Elemente Canvas und Input noch nicht existieren. Lege das Javascript an das Ende des Body, vor das schließende </body>.

    Zitat

    Warum kann er das denn nicht laden ?

    Du hast doch geschrieben, dass Du es offline verwenden willst. Wenn Du noch das Laden von den CDNs drin hast, kann es dann nicht funktionieren.

    Wenn es daran nicht liegt, dann poste noch Mal, wie Du jQuery und jCanvas eingebunden hast und was die Console anzeigt.

    Zitat

    Was und wie muss ich dieses jQuery runterladen und einbinden ?

    und dann JCanvas runterladen?

    Für den Anfang brauchst Du es nicht herunterzuladen, sondern Du kannst beide von einem CDN einbinden:

    Code
        <script src="//code.jquery.com/jquery-1.10.2.js"></script>
        <script src="//cdnjs.cloudflare.com/ajax/libs/jcanvas/20.1.2/jcanvas.js"></script>

    Inzwischen habe ich es geändert, so dass es mehr auf deine Anwendung passt:

    https://jsfiddle.net/Sempervivum/1somodv3/1/

    Mit createCircleDisplay() wird die Anzeige aufgebaut, dies brauchst Du nur einmal beim Laden der Seite aufzurufen.

    Mit updateCircleDisplay() wird der angezeigte Wert geändert.

    Das Eingabefeld ist nur zur Demonstration, das kannst Du später weg lassen.

    Deine Auswahl der Schwierigkeit ist doch das beste Beispiel. Es kann nur einen Level geben und was Du mühevoll bei den Checkbuttons mit Javascript programmiert hast, macht eine Gruppe von Radiobuttons von allein. Wenn eine Mehrfachauswahl gefragt ist, kann man Checkbuttons verwenden.

    Das data-Attribut legt fest, zu welchen Tag das Bild gehört, also bei data-day="14" würde das Bild zum 14. Dezember gehören. Wenn ich diese Zahl jetzt dem ersten Bild zuordne, passt es doch nicht, denn das Bild "/Adventskalender/img/fst_px/px01_1.gif" gehört doch zum 1. Dezember oder nicht? Oder ist das egal? Ich weiß ja nicht, wie die Bilder aussehen.

    Zitat

    Also sagt man dann damit, dass das Erwartete eine Zahl die 5 Nummern lang sein muss ist. ^ und $ vor und hinter den vorgaben sagen dann aus, dass nach den 5 Nummern schluss ist.

    Genau. Oder anders gesagt, die Regex passt, wenn zwischen Anfang und Ende genau fünf Ziffern stehen.

    Zitat

    Der Lösungsweg mit dem .match("muster") ist doch nicht so gut.

    Das möchte ich entschieden bezweifeln. Das Problem ist, dass die Regex passt, wenn irgendwo fünf Ziffern hintereinander stehen. Das ist dann auch der Fall, wenn die Eingabe sechs, sieben oder hundert Ziffern enthält.

    Die Regex kann man sehr leicht anpassen, so dass nicht weniger und nicht mehr als fünf Zeichen vorhanden sein dürfen:

    Code
    if (plzval.match(/^[0-9]{5}$/))

    Funktioniert bei mir, probiere es aus.

    Zitat

    match(/[0-9]{5}/) -> die / sagen aus das es beginnt und es beendet. In den [] stehen dann die zugelassenen Zahlen und in der {} Klammer steht dann die Länge der zugelassenen Zahl. Stimmt das so ?

    Korrekt. Zu Regex findet man sehr viel im Netz, auch Online-Tester als Hilfe beim Entwickeln.

    Zwei Probleme:

    1. In Zeile 24 bist Du schon im else-Zweig der Abfrage if(plz.length === 5), d. h. die Länge ist in jedem Fall ungleich 5 und Du kommst nie in den else-Zweig in Zeile 32 hinein.

    2. Die Variable "plz" ist doppelt belegt, einmal mit dem DOM-Element und dann mit dessen Value. Besser dem Value einen anderen Namen geben, z. b. "plzval".


    So funktioniert es:

    Ich habe, statt nur die Länge abzufragen, mit einer Regex zusätzlich geprüft, ob die Eingabe auch nummerisch ist.

    Zitat

    Change greift dann erst, wenn was verändert wurde ?

    Change triggert dann, wenn die Eingabe mit Enter bestätigt wurde. Keyup oder Input haben jedoch den Vorteil, dass man den Wert während der Eingabe überprüfen kann, so wie es jetzt der Fall ist.

    Häufiger Fehler:

    Code
    plz.addEventListener("keyup", getJson());

    Was passiert: Da der Funktionsname getJson von einem Klammernpaar gefolgt wird, wird die Funktion sofort ausgeführt und ihr Rückgabewert zugewiesen. Das Klammernpaar muss man weg lassen, dann wird eine Referenz der Funktion zugewiesen:

    Code
    plz.addEventListener("keyup", getJson);

    Außerdem ist es ungünstig, hier das keyup-Event zu verwenden, da dieses ja bei jedem Tastendruck feuert, so dass die Auswertung fehl schlägt, wenn noch keine fünf Zeichen eingegeben wurden. Besser "change" verwenden oder prüfen, ob schon fünf Ziffern eingegeben wurden.

    Code
    data.places[0].[place name];

    Da sind zwei Syntaxfehler:

    1. Der Punkt ist zuviel.
    2. Da place name keine Variable ist, sondern ein String und weil es ein Leerzeichen enthält, muss es in Hochkommas eingeschlossen werden.

    So funktioniert es:

    Code
    var wohnort = data.places[0]["place name"];

    1. Möglichkeit, ein Element in einem Objekt anzusprechen:

    data.country

    2. Möglichkeit:

    data["country"]

    diese Möglichkeit funktioniert auch, wenn der Schlüssel in einer Variablen steht:

    Code
    var key = "country";
    var country = data[key];

    Mit der 1. Möglichkeit funktioniert dies nicht.

    Nächster Schritt: Nur eine Funktion verwenden:


    HTML:

    Code
    <br>Leicht:
      <input type="radio" name="rblevel" id="leicht1" data-speedq="1000"> Mittel:
      <input type="radio" name="rblevel" id="leicht2" data-speedq="500"> Schwer:
      <input type="radio" name="rblevel" id="leicht3" data-speedq="250"> Super schwer:
      <input type="radio" name="rblevel" id="leicht4" data-speedq="100">


    JS:

    Code
    function setSpeed() {
        var speedq = this.getAttribute("data-speedq");
        sessionStorage.setItem('speedq', speedq);
    }
    leicht1.onchange = setSpeed;
    leicht2.onchange = setSpeed;
    leicht3.onchange = setSpeed;
    leicht4.onchange = setSpeed;
    Zitat

    wie man das ganze Script vieleicht auch mit wenniger code hinbekommen tut

    Dieses hier kannst Du einsparen, wenn Du statt Checkbuttons Radiobuttons verwendest:

    Code
        document.getElementsByName('leicht1')[0].checked =true;
        document.getElementsByName('leicht2')[0].checked =false;
        document.getElementsByName('leicht3')[0].checked =false;
        document.getElementsByName('leicht4')[0].checked =false;