Beiträge von Sempervivum

    Hier jetzt das Javascript für die Überprüfung ob alles OK ist und das Abschicken mit fetch. Ungetestet, wenn es nicht gleich läuft, versuche selbst, den Fehler zu finden.

    PS: Man kann auch auf die browsereigene Validierung aufbauen, das würde dann so aussehen:

    Im CSS müssen wir uns dann auf die Pseudoklasse beziehen:

    Code
            input:invalid {
                color: red;
            }

    Jetzt verstehe ich, was Du mit Wertevorrat meintest. Das ist nicht ganz so einfach wie es zunächst scheint weil man ja nicht einfach die Eingaben des Benutzers unterbinden kann. Man müsste abwarten bis er das JSON abschickt und es dann blockieren mit einem geeigneten Hinweis.

    Versuche dies, zunächst einen Button für das Abschicken des JSON:

    Code
        <button type="button" id="send-it">Abschicken</button>

    Und dann dies Javascript:

    Es fügt eine Klasse "invalid" hinzu wenn die Eingabe ungültig ist. Damit können wir die Darstellung des Eingabefeldes mit CSS ändern, z. B. so:

    Code
            input.invalid {
                color: red;
            }

    Wird bei ungültiger Eingabe der Button gedrückt, bekommt der Benutzer einen Hinweis.

    Was dieses betrifft:

    Zitat

    Wo ich auch eine Lösung finden wollte, aber noch nichts gefunden habe ist folgendes.

    Wenn auf Übertragen geklickt wird, kommt eine Bestätigungsseite. Besser wäre natürlich man würde auf der Seite bleiben und der Button würde z.B. auf Reset wechseln und die Felder wieder zurücksetzen, oder die Seite neu laden.

    Wo liegt denn diese HTML-Seite? Du kannst sie ja selbst ändern. Wird sie dann auf den ESP hoch geladen oder bleibt sie lokal und Du öffnest sie irgend wie durch Doppelklick o. ä.?

    Guten Morgen!

    So wie Du zuvor zwei Eingabefelder gebraucht hast, wirst Du jetzt zwei Auswahllisten brauchen. Ich dachte erst, wir müssten auch die Liste verdoppeln aber das ist gar nicht nötig, die beiden können die selbe datalist verwenden:

    Code
        <label>Lied 1: <input id="input-liedname-1" list="datalist-lieder" type="text"></label>
        <label>Lied 2: <input id="input-liedname-2" list="datalist-lieder" type="text"></label>
        <datalist id="datalist-lieder">
        </datalist>

    Die Generierung mit der for-of-Schleife bleibt dann wie sie ist.

    Und die Werte kannst Du dann so heraus holen:

    Zunächst eine Funktion definieren:

    Code
            function liedHolen(sel) {
                inputLied = document.querySelector(sel);
                const splitted = inputLied ? inputLied.value.split(': ') : ['', ''];
                return { nr: splitted[0], name: splitted[1] };
            }

    Und dann damit die Werte holen:

    Hm, ich habe gerade deinen Code in meine Testdatei übernommen und da kommen die Vorschläge. Sieh doch mal in der Console nach ob da Fehlermeldungen kommen.

    Nummer und Name kann man auf diese Weise aufteilen:

    Und dann kannst Du Nummer und Name so ermitteln:

    Code
                const splitted = inputLiednamen.value.split(': ');
                let nr1= splitted[0];
                let name1= splitted[1]

    Auch das ist recht einfach weil es heute das datalist-Element gibt. Füge dies statt des Eingabefeldes für die Nummer ins HTML ein:

    Code
        <label>Liednamen: <input id="input-liedname" list="datalist-lieder" type="text"></label>
        <datalist id="datalist-lieder">
        </datalist>

    Und dies am Ende des body, vor dem schließenden </body>:

    Edit, ich vergaß, auf Nummer und Liedname kannst Du dann so zugreifen:

    Code
                var json;
                var verein = document.querySelector('input[name="verein"]:checked').value;
                if (verein === "liednummer1") {
                    var liedname = inputLiedname.value;
                    json = [
                                {"text":[74,5,"MUSIKKAPELLE","fonts/bahnschrift20",1]},
                                //{"text":[83,36,nummer1,"fonts/calibrib80",1]},
                                {"text":[95,36,liedname,"fonts/calibrib80",1]},
                                {"text":[48,105,"ORT","fonts/bahnschrift20",1]}

    Über die Anordnung muss man vielleicht noch nachdenken. Müssen da Nummer und Name getrennt sein? Wäre auch kein Problem.

    Das Ganze gestaltet sich viel einfacher als ich zunächst erwartet hatte. Als ersten Schritt schlage ich vor, dass wir das mit festem Javascript machen:

    Ich habe die wenigen Einträge in der CSV-Datei von Hand umeditiert. Füge dies in das Javascript oben ein:

    Dann kannst Du in dem Code aus #14 den Text ganz einfach aus der Nummer ermitteln:

    Code
                var json;
                var verein = document.querySelector('input[name="verein"]:checked').value;
                if (verein === "liednummer1") {
                    var nummer1 = document.getElementById("nummer1").value;
                    var liedname = liednamen[nummer1]; // <-- hier
                    json = [
                                {"text":[74,5,"MUSIKKAPELLE","fonts/bahnschrift20",1]},
                                {"text":[83,36,nummer1,"fonts/calibrib80",1]},
                                {"text":[95,36,liedname,"fonts/calibrib80",1]},
                                {"text":[48,105,"ORT","fonts/bahnschrift20",1]}

    Ich dachte zunächst daran, eine Funktion holeLiedName zu machen aber wie Du siehst ist das so einfach, dass es nicht lohnt.

    Wenn das funktioniert, gehen wir daran, die CSV-Datei zu laden und auszuwerten.

    OK, ich denke, jetzt verstehe ich es: Das JSON gibt die Struktur eines Konzertes wieder und dort sollen dynamisch die Texte aus dem Vorrat von 250 eingetragen werden.

    Gibt es die 250 Stücke denn schon in irgend einer Form als Datei, z. B. Excel, so dass man sie durch ein Skript einlesen könnte? 250 sind ja schon ein ganze Menge und es wäre viel Arbeit, sie von Hand einzutragen.

    Zitat

    Also die Seite kann man ändern. Die habe ich erstellt. Die kann ich also jederzeit austauschen gegen das was ich will.

    Das ist ja schon mal eine gute Nachricht und vereinfacht die Sache stark.

    Zitat

    es handelt sich hier um ca. 250 Datensätze bestehend aus "NR" und "NAME"

    Das verstehe ich jetzt wieder nicht: Im JSON in der HTML-Datei nur wenige Einträge und jetzt um 250?

    Guten Abend,

    das ist ja wirklich eine überschaubare Anzahl an Elementen oder hast Du das JSON gekürzt?

    Ich dachte zunächst daran, einfach das JSON im Quelltext um die Texte zu erweitern aber das geht nicht, wenn ich das richtig verstehe, weil die HTML-Seite vom ESP kommt und Du sie dort nicht ändern kannst. Sehe ich das richtig? Auch das Einfügen von zusätzlichem Javascript ist dann nicht möglich.

    Mir fällt da die Lösung ein, die Änderungen durch ein Userscript mit Tampermonkey zu machen, dafür müsste diese Erweiterung im Browser installiert werden. Wäre das eine Möglichkeit?

    Ich schließe jetzt erst Mal den Tag ab, gute Nacht. Vielleicht kann sich heute Abend noch jemand anders dieser Sache annehmen.

    Guten Abend Crazyman,

    Du brauchst auch nicht auf "background-size: cover;" zu verzichten, denn es gibt auch "object-fit: cover;" für Bilder, die keine Hintergrundbilder sind, siehe hier:

    img-Bilder mit CSS einpassen - object-fit: und object-position:
    direkt in HTML integrierte Bilder werden mit CSS in Bereiche eingepasst über object-fit: contain, object-fit:cover, object-fit:fill, object-fit:none,…
    www.html-seminar.de

    Wichtig dabei ist, dass man dem Bild die Größe geben muss, in die der Browser es einpassen soll, in diesem Fall 100% für Breite und Höhe, damit das Bild seinen Container ausfüllt. Nachdem ich das getan hatte, hat es immer noch nicht richtig funktioniert und ich musste bei Stackoverflow nachlesen:

    SVG image not aligning to equivalent of 'object-fit' in 100vh viewport
    I'm trying to get an SVG image to be the equivalent of object-fit inside an 100vh full screen container. From what I can gather I need to use the…
    stackoverflow.com

    preserveAspectRatio="xMidYMid slice" war die Lösung.

    Damit funktioniert es dann, die Bilder stehen wie fest genagelt übereinander, egal, wie man die Größe des Browserfensters zieht.

    Etwas unschön ist, dass ich das SVG durch Transformation an die richtige Position und die richtige Größe bringen musste. Besser wäre es, wenn Du die Formen so ändern könntest, dass das Bild von Anfang an die richtige Größe hat und die Formen darin die richtige Position.

    Hier das vollständige HTML und CSS, ich war so frei und habe einige überflüssige Container entfernt: