Button hinzufügen & in local storage speichern(Einkaufsliste)

Diskutiere Button hinzufügen & in local storage speichern(Einkaufsliste) im JavaScript Forum im Bereich Programmierung; Guten Tag, Ich kenne mich in JavaScript leider schlecht aus weshalb ich nicht weiß wie ich einen button, zum löschen eines Eintrags, hinzufüge und...
  • Button hinzufügen & in local storage speichern(Einkaufsliste) Beitrag #1
D
dranoel25
Member
Beiträge
6
Punkte Reaktionen
0
Guten Tag,
Ich kenne mich in JavaScript leider schlecht aus weshalb ich nicht weiß wie ich einen button, zum löschen eines Eintrags, hinzufüge und die Liste in local storage speichere. Will nicht 1 zu 1 nach einem Tutorial coden weil ich meine Erfahrungen gerne selbst mache.
Code: <script>


var enterButton = document.getElementById("add");
var input = document.getElementById("textfield");
var ul = document.querySelector("ul");
var item = document.getElementsByTagName("li");



function erstellenEintrag(){
if(input.value !=''){
var li = document.createElement("li");

li.appendChild(document.createTextNode(input.value));

ul.appendChild(li);

input.value = "";

li.addEventListener("click", abgehaktEintrag);

function abgehaktEintrag(){
li.classList.toggle("done")
}
}
}

enterButton.addEventListener("click", erstellenEintrag);

</script>
Wäre sehr nett wenn mir jemand helfen könnte, dass ich in JavaScript besser rein finde :D
L.G. Leonard
 
  • Button hinzufügen & in local storage speichern(Einkaufsliste) Beitrag #2
N
nafets
New member
Beiträge
4
Punkte Reaktionen
1
Das vorliegende JavaScript-Code-Snippet definiert eine Funktion, die ein einfaches Eingabe- und Ausgabesystem für Aufgaben oder Einträge bereitstellt. Lass uns den Code Schritt für Schritt betrachten:

1. Zu Beginn des Codes werden Variablen definiert, um auf bestimmte Elemente in der HTML-Datei zuzugreifen. Es gibt vier Variablen:

- `enterButton` bezieht sich auf das Element mit der ID "add". Das könnte beispielsweise ein Button sein, der zum Hinzufügen eines Eintrags verwendet wird.
- `input` bezieht sich auf das Element mit der ID "textfield". Dies könnte ein Textfeld sein, in dem der Benutzer einen Eintrag eingeben kann.
- `ul` bezieht sich auf das erste `ul`-Element auf der Seite. Dies könnte eine ungeordnete Liste sein, in der die Einträge angezeigt werden.
- `item` ist eine Sammlung von Elementen mit dem Tag "li" (Listenelement). Dies sind bereits vorhandene Einträge, die möglicherweise auf der Seite vorhanden sind.

2. Die Funktion `erstellenEintrag` wird definiert. Diese Funktion wird ausgeführt, wenn der Benutzer auf den "enterButton" klickt. Zuerst wird überprüft, ob der Wert des "input"-Elements nicht leer ist. Wenn es nicht leer ist, wird ein neues `li`-Element erstellt und dem `ul`-Element hinzugefügt. Der Wert des "input"-Elements wird dann zurückgesetzt.

3. Das neu erstellte `li`-Element erhält einen Event-Listener, der auf Klickereignisse reagiert. Wenn der Benutzer auf ein Eintrags-`li`-Element klickt, wird die Funktion `abgehaktEintrag` aufgerufen.

4. Die Funktion `abgehaktEintrag` wird definiert. Diese Funktion ändert den Klassenwert des angeklickten `li`-Elements und fügt oder entfernt die Klasse "done". Dadurch kann das Aussehen des Eintrags geändert werden, um anzuzeigen, dass er erledigt wurde (z. B. durch Hinzufügen einer durchgestrichenen Linie).

5. Schließlich wird ein Event-Listener dem "enterButton" hinzugefügt, der die Funktion `erstellenEintrag` aufruft, wenn der Benutzer auf den Button klickt. Dadurch wird der Prozess zum Hinzufügen eines neuen Eintrags aktiviert.

Insgesamt ermöglicht dieser Code die Interaktion mit einem Eingabe- und Ausgabesystem für Aufgaben oder Einträge. Der Benutzer kann neue Einträge hinzufügen und vorhandene Einträge als erledigt markieren, indem er auf sie klickt.

da hinzufügen müsste so funktionieren (Code ist ungetestet und ich würde mein wissen als Anfänger bezeichnen)

Javascript:
<script>
    var enterButton = document.getElementById("add");
    var input = document.getElementById("textfield");
    var ul = document.querySelector("ul");
    var item = document.getElementsByTagName("li");

    // Funktion zum Erstellen eines Eintrags
    function erstellenEintrag() {
        // Überprüfe, ob das Eingabefeld nicht leer ist
        if (input.value !== '') {
            // Erstelle ein neues <li> Element
            var li = document.createElement("li");

            // Füge den eingegebenen Text als Textknoten hinzu
            li.appendChild(document.createTextNode(input.value));

            // Füge das <li> Element der <ul> Liste hinzu
            ul.appendChild(li);

            // Setze den Wert des Eingabefelds zurück
            input.value = "";

            // Füge einen Event-Listener hinzu, um den Eintrag als erledigt zu markieren
            li.addEventListener("click", abgehaktEintrag);
            
            // Erstelle einen Lösch-Button
            var deleteButton = document.createElement("button");
            
            // Setze den Text des Lösch-Buttons auf "Löschen"
            deleteButton.appendChild(document.createTextNode("Löschen"));
            
            // Füge den Lösch-Button dem <li> Element hinzu
            li.appendChild(deleteButton);
            
            // Füge einen Event-Listener hinzu, um den Eintrag zu löschen
            deleteButton.addEventListener("click", loescheEintrag);
        }
    }

    // Funktion zum Markieren eines Eintrags als erledigt
    function abgehaktEintrag() {
        // Wechsle die CSS-Klasse "done" für das <li> Element
        this.classList.toggle("done");
    }

    // Funktion zum Löschen eines Eintrags
    function loescheEintrag() {
        // Entferne das übergeordnete Element (das <li> Element)
        this.parentNode.remove();
    }

    // Füge den Event-Listener hinzu, um einen Eintrag zu erstellen
    enterButton.addEventListener("click", erstellenEintrag);
</script>


viel Spaß! Stefan
 
  • Button hinzufügen & in local storage speichern(Einkaufsliste) Beitrag #3
D
dranoel25
Member
Beiträge
6
Punkte Reaktionen
0
Der Code funktioniert super! Deine Erklärungen helfen mir sehr den Code zu verstehen und danke, dass du dir die Mühe gemacht hast jeden Schritt zu erklären.
Weißt du auch noch wie ich die Liste in local storage speichere, also dass die Liste nicht gelöscht wird, wenn ich die Seite neu lade?
L.G. Leonard

P.S. wie lange codest du schon?
 
  • Button hinzufügen & in local storage speichern(Einkaufsliste) Beitrag #4
N
nafets
New member
Beiträge
4
Punkte Reaktionen
1
müsste vielleicht so funktionieren:

LocalStorage: Du kannst den LocalStorage verwenden, um die Liste im Browser des Benutzers zu speichern. Dazu musst du die Liste als JSON-String serialisieren und im LocalStorage speichern. Beim Laden der Seite kannst du dann den LocalStorage überprüfen und die gespeicherte Liste wiederherstellen. Hier ist ein Beispiel:

Javascript:
<script>
    var enterButton = document.getElementById("add"); // Referenz zum Button mit der ID "add" abrufen
    var input = document.getElementById("textfield"); // Referenz zum Textfeld mit der ID "textfield" abrufen
    var ul = document.querySelector("ul"); // Referenz zur ersten UL-Liste auf der Seite abrufen
    var item = document.getElementsByTagName("li"); // Referenz zu allen LI-Elementen auf der Seite abrufen

    // Funktion zum Erstellen eines Eintrags
    function erstellenEintrag() {
        if (input.value !== '') { // Überprüfen, ob das Eingabefeld nicht leer ist
            var li = document.createElement("li"); // Neues LI-Element erstellen
            li.appendChild(document.createTextNode(input.value)); // Dem LI-Element den eingegebenen Text hinzufügen
            ul.appendChild(li); // Das LI-Element zur UL-Liste hinzufügen
            input.value = ""; // Das Eingabefeld leeren
            li.addEventListener("click", abgehaktEintrag); // Event-Listener hinzufügen, um den Eintrag als erledigt zu markieren

            var deleteButton = document.createElement("button"); // Neuen Lösch-Button erstellen
            deleteButton.appendChild(document.createTextNode("Löschen")); // Dem Lösch-Button den Text "Löschen" hinzufügen
            li.appendChild(deleteButton); // Den Lösch-Button dem LI-Element hinzufügen
            deleteButton.addEventListener("click", loescheEintrag); // Event-Listener hinzufügen, um den Eintrag zu löschen

            speichereListe(); // Liste speichern, nachdem ein Eintrag hinzugefügt wurde
        }
    }

    // Funktion zum Markieren eines Eintrags als erledigt
    function abgehaktEintrag() {
        this.classList.toggle("done"); // Die CSS-Klasse "done" für das LI-Element umschalten, um den Eintrag als erledigt zu markieren
        speichereListe(); // Liste speichern, nachdem ein Eintrag markiert wurde
    }

    // Funktion zum Löschen eines Eintrags
    function loescheEintrag() {
        this.parentNode.remove(); // Das übergeordnete Element (LI-Element) entfernen, um den Eintrag zu löschen
        speichereListe(); // Liste speichern, nachdem ein Eintrag gelöscht wurde
    }

    // Funktion zum Speichern der Liste im LocalStorage
    function speichereListe() {
        var listItems = []; // Array zum Speichern der Einträge erstellen
        for (var i = 0; i < item.length; i++) {
            listItems.push(item[i].textContent); // Textinhalt jedes LI-Elements zum Array hinzufügen
        }
        var json = JSON.stringify(listItems); // Array in einen JSON-String umwandeln
        localStorage.setItem("liste", json); // JSON-String im LocalStorage unter dem Schlüssel "liste" speichern
    }

    // Funktion zum Wiederherstellen der Liste aus dem LocalStorage
    function wiederherstelleListe() {
        var json = localStorage.getItem("liste"); // JSON-String aus dem LocalStorage abrufen
        if (json) { // Überprüfen, ob ein JSON-String vorhanden ist
            var listItems = JSON.parse(json); // JSON-String in ein Array umwandeln
            for (var i = 0; i < listItems.length; i++) {
                var li = document.createElement("li"); // Neues LI-Element erstellen
                li.appendChild(document.createTextNode(listItems[i])); // Dem LI-Element den Text aus dem Array hinzufügen
                ul.appendChild(li); // Das LI-Element zur UL-Liste hinzufügen
                li.addEventListener("click", abgehaktEintrag); // Event-Listener hinzufügen, um den Eintrag als erledigt zu markieren

                var deleteButton = document.createElement("button"); // Neuen Lösch-Button erstellen
                deleteButton.appendChild(document.createTextNode("Löschen")); // Dem Lösch-Button den Text "Löschen" hinzufügen
                li.appendChild(deleteButton); // Den Lösch-Button dem LI-Element hinzufügen
                deleteButton.addEventListener("click", loescheEintrag); // Event-Listener hinzufügen, um den Eintrag zu löschen
            }
        }
    }

    // Event-Listener hinzufügen, um einen Eintrag zu erstellen
    enterButton.addEventListener("click", erstellenEintrag);

    // Liste beim Laden der Seite aus dem LocalStorage wiederherstellen
    wiederherstelleListe();
</script>

  • Die Funktion speichereListe() erstellt ein Array listItems, in dem alle Textinhalte der Listenelemente gespeichert werden.
  • Das Array listItems wird dann in einen JSON-String umgewandelt und im LocalStorage unter dem Schlüssel "liste" gespeichert.
  • Beim Laden der Seite wird die Funktion wiederherstelleListe() aufgerufen, um die Liste aus dem LocalStorage wiederherzustellen.
  • Die Funktion wiederherstelleListe() ruft zuerst localStorage.getItem("liste") auf, um den gespeicherten JSON-String abzurufen.
  • Falls ein JSON-String vorhanden ist, wird er in ein Array listItems umgewandelt.
  • Für jedes Element im Array listItems wird ein neues Listene
weitere möglichkeiten zum speichern sind:
Serverseitige Speicherung: Wenn du eine serverseitige Umgebung verwendest, kannst du die Liste an den Server senden und dort speichern, z. B. in einer Datenbank. Du kannst eine AJAX-Anfrage verwenden, um die Liste an den Server zu senden und sie dort zu speichern.
Datenbank oder Dateisystem: Du kannst eine externe Datenbank oder ein Dateisystem verwenden, um die Liste zu speichern. Dazu benötigst du eine serverseitige Technologie wie Node.js oder PHP, um die Liste zu verarbeiten und in der Datenbank oder Datei zu speichern.

viel spaß Stefan

PS "Angerfangen vor 30 Jahren aber immer nur für den privaten Gebrauch mit BASIC > QB > VBasic > html > css > PHP > sql > PowerShell und seit 3monaten javascript hauptsächlich aber PHP und PS und VB(in Excel) aber überall nur rudimentäre Ahnung !"
 
  • Button hinzufügen & in local storage speichern(Einkaufsliste) Beitrag #5
T
tk1234
Well-known member
Beiträge
103
Punkte Reaktionen
8
3. Das neu erstellte `li`-Element erhält einen Event-Listener, der auf Klickereignisse reagiert. Wenn der Benutzer auf ein Eintrags-`li`-Element klickt, wird die Funktion `abgehaktEintrag` aufgerufen.
li-Elemente sind keine interaktiven Elemente und damit nicht (für jeden) klickbar - dafür müssen immer Links bzw. Buttons verwendet werden (in dem Fall ein <button type="button">.
 
  • Button hinzufügen & in local storage speichern(Einkaufsliste) Beitrag #6
D
dranoel25
Member
Beiträge
6
Punkte Reaktionen
0
der "Löschen" Text wird mit abgespeichert. wie kann ich das fixen?
 
  • Button hinzufügen & in local storage speichern(Einkaufsliste) Beitrag #7
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Poste doch auch mal das HTML, damit man sehen kann, wie der Löschen-Test dort hinein kommt und wie man ihn weg bekommt.

Edit: Ein wenig genauer in das Javascript geschaut und offenbar wird der Löschen-Button jeweils dem li-Element hinzu gefügt. Und textContent liest nicht nur den Text auf der obersten Stufe sondern einschl. aller Nachfahren. Lösung indem man den Text aus dem ersten childNode liest:
Code:
// Funktion zum Speichern der Liste im LocalStorage
        function speichereListe() {
            var listItems = []; // Array zum Speichern der Einträge erstellen
            for (var i = 0; i < item.length; i++) {
                listItems.push(item[i].childNodes[0].textContent); // Textinhalt jedes LI - Elements zum Array hinzufügen
                // Wir benutzen die Childnodes, damit der Textinhalt des Löschen-Buttons ausgeschlossen ist.
                // Da das Listenelement aus einer Textarea gefüllt, wird, müsste ausgeschlossen sein, dass es
                // mehrere Childnodes gibt, abgesehen vom Löschen-Button.
            }
            var json = JSON.stringify(listItems); // Array in einen JSON - String umwandeln
            localStorage.setItem("liste", json); // JSON-String im LocalStorage unter dem Schlüssel "liste" speichern
        }
Ungetestet, wenn es so nicht funktioniert, müssen wir weiter sehen. Man könnte auch daran denken, das gesamte HTML einschl.Löschen - Button zu speichern aber ich wollte die Baustelle zunächst nicht weiter aufreißen.
 
Zuletzt bearbeitet:
  • Button hinzufügen & in local storage speichern(Einkaufsliste) Beitrag #8
D
dranoel25
Member
Beiträge
6
Punkte Reaktionen
0
der Code funktioniert(y) wäre noch Top wenn die Klasse auch abgespeichert werden würden. Die Klasse done streicht eine Sache durch, wenn sie erledigt wurde also blöd wenn man jedes mal neu abhacken muss.
Diesmal auch mit dem kompletten Code :D https://codepen.io/dranoel25/pen/abQoKEQ
P.S. die Website soll fürs Handy sein, also sieht das designe da nicht so schön aus
 
  • Button hinzufügen & in local storage speichern(Einkaufsliste) Beitrag #9
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Auch kein Problem, wir brauchen nur ein boolean "done" hinzu zu fügen:
Code:
        // Funktion zum Speichern der Liste im LocalStorage
        function speichereListe() {
            var listItems = []; // Array zum Speichern der Einträge erstellen
            for (var i = 0; i < item.length; i++) {
                // Prüfen ob die Klasse "done" vorhanden ist und in Variable eintragen
                var done = item[i].classList.contains("done");
                // Textinhalt jedes LI - Elements zum Array hinzufügen
                // Um zwei Elemente speichern benutzen wir ein Objekt.
                // Vor dem Doppelpunkt steht der Name und rechts davon der Wert.
                listItems.push({done: done, item: item[i].childNodes[0].textContent});
                // Wir benutzen die Childnodes, damit der Textinhalt des Löschen-Buttons ausgeschlossen ist.
                // Da das Listenelement aus einer Textarea gefüllt, wird, müsste ausgeschlossen sein, dass es
                // mehrere Childnodes gibt, abgesehen vom Löschen-Button.
            }
            var json = JSON.stringify(listItems); // Array in einen JSON - String umwandeln
            localStorage.setItem("liste", json); // JSON-String im LocalStorage unter dem Schlüssel "liste" speichern
        }
Weil Du oben schriebst, dass Du deine Erfahrungen gern selbst machst, kannst Du ja versuchen, das Auslesen selbst zu ändern. Sieh dir dazu die Beschreibung von classList an:
https://wiki.selfhtml.org/wiki/JavaScript/DOM/Element/classList
 
  • Button hinzufügen & in local storage speichern(Einkaufsliste) Beitrag #10
D
dranoel25
Member
Beiträge
6
Punkte Reaktionen
0
ok ich bin überfordert xD wenn ich jetzt Neustarte steht da nur noch [Objekt Objekt] und der button zum löschen...
P.S. wie macht ihr diese Felder wo der Code steht?
 
Zuletzt bearbeitet:
  • Button hinzufügen & in local storage speichern(Einkaufsliste) Beitrag #11
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Das liegt daran, dass ich nur die halbe Arbeit gemacht hatte. Du musst auch das Auslesen ändern:
Code:
        // Funktion zum Wiederherstellen der Liste aus dem LocalStorage
        function wiederherstelleListe() {
            var json = localStorage.getItem("liste"); // JSON-String aus dem LocalStorage abrufen
            if (json) { // Überprüfen, ob ein JSON-String vorhanden ist
                var listItems = JSON.parse(json); // JSON-String in ein Array umwandeln
                for (var i = 0; i < listItems.length; i++) {
                    var li = document.createElement("li"); // Neues LI-Element erstellen
                    // Dem LI-Element den Text aus dem Array hinzufügen
                    // Weil es sich jetzt um ein Objekt handelt,
                    // müssen wir das Element "item" heraus lesen.
                    li.appendChild(document.createTextNode(listItems[i].item));
                    // War im localStorage gespeichert, dass der Listenpunkt erledit ist,
                    // fügen wir die Klasse "done" hinzu
                    if (listItems[i].done) li.classList.add("done");
                   
                    ul.appendChild(li); // Das LI-Element zur UL-Liste hinzufügen
                    li.addEventListener("click", abgehaktEintrag); // Event-Listener hinzufügen, um den Eintrag als erledigt zu markieren
   
                    var deleteButton = document.createElement("button"); // Neuen Lösch-Button erstellen

                    deleteButton.appendChild(document.createTextNode("x")); // Dem Lösch-Button den Text "Löschen" hinzufügen
                    li.appendChild(deleteButton); // Den Lösch-Button dem LI-Element hinzufügen
                    deleteButton.addEventListener("click", loescheEintrag); // Event-Listener hinzufügen, um den Eintrag zu löschen
                }
            }
        }
 
  • Button hinzufügen & in local storage speichern(Einkaufsliste) Beitrag #12
D
dranoel25
Member
Beiträge
6
Punkte Reaktionen
0
Hey,
hat jetzt nichts mehr mit dem Titel zu tun aber weiß jemand ob es möglich ist die Einträge auch auf andere Geräte zu übertragen? Also dass man die Einkaufsliste z.B. mit der ganzen Familie nutzen kann?
 
  • Button hinzufügen & in local storage speichern(Einkaufsliste) Beitrag #13
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Ja, das ist möglich, indem Du die Einkaufsliste nicht im Localstorage sondern auf einem Server speicherst. Stefan bzw. nafets hat das ja schon angesprochen. Hast Du überhaupt Webspace bzw. eine Homepage?
Da machst Du aber eine ziemlich komplexe Baustelle auf, weil man berücksichtigen muss, dass mehrere Benutzer gleichzeitig an der Liste arbeiten und sich die Änderungen überkreuzen. Das kann dann dazu führen, dass Änderungen verloren gehen.
 
Thema:

Button hinzufügen & in local storage speichern(Einkaufsliste)

Oben Unten