JavaScriptsVerschiedenes

To Do List

Eine Aufgabenliste zum Selbstausfüllen: Jeder Besucher trägt seine eigenen Vorhaben ein, gespeichert im eigenen Browser.

Diese To-Do-Liste von unserem User vareside könnt ihr auf eurer Seite einbauen, damit eure Besucher dort ihre eigenen Termine, Aufgaben oder Vorhaben notieren. Jeder Eintrag lässt sich später wieder bearbeiten oder löschen — die Liste ist also ein kleiner Notizblock, der beim nächsten Besuch noch da ist.

Das Ausprobieren geht direkt hier: Tippt in das Feld eine Aktion ein und klickt auf „Aktion hinzufügen“ (die Eingabetaste tut es auch). Der Eintrag erscheint nummeriert in der Liste darunter, jeweils mit den Knöpfen „Bearbeiten“ und „Löschen“ daneben. „Bearbeiten“ öffnet ein kleines Eingabefenster des Browsers, in dem der bisherige Text schon steht und geändert werden kann.

Wichtig zu wissen: Die Liste liegt ausschließlich im Speicher des Browsers, mit dem sie geschrieben wurde. Sie wird nirgendwohin übertragen, und niemand außer diesem einen Besucher sieht sie. Das bedeutet aber auch: Auf einem anderen Gerät oder in einem anderen Browser ist die Liste nicht vorhanden, und wer die Websitedaten seines Browsers löscht, löscht die Liste mit. Für eine Einkaufsliste ist das genau richtig, für wichtige Termine solltet ihr eure Besucher nicht darauf verweisen.

Technisch nutzt die modernisierte Fassung dafür localStorage — den Ablagebereich, den jeder Browser einer Website zur Verfügung stellt. Früher steckten die Einträge in Cookies. Der Unterschied ist mehr als kosmetisch: Cookies werden bei jedem einzelnen Seitenaufruf an den Server mitgeschickt, localStorage bleibt auf dem Rechner des Besuchers. Ob ein Browser überhaupt Cookies annimmt, verrät euch übrigens unser Cookietest.

Alle sichtbaren Texte — „Aktion hinzufügen“, „Bearbeiten“, „Löschen“ und die Meldung für die leere Liste — stehen als schlichte Zeichenketten im Script und lassen sich mit jedem Texteditor austauschen. Wer noch mehr Werkzeug für seine Besucher sucht: In derselben Rubrik liegen die Seitensuche und der Passwortgenerator.

Verschiedenes Baujahr 2008 läuft in deinem Browser

Was ihr hier eintragt, bleibt in diesem Browser und wird nicht übertragen.

Eingesandt von vareside

So funktioniert das Script

Das Script hat vier Aufgaben: Es legt Einträge im Browserspeicher ab, holt sie wieder heraus, baut daraus eine Tabelle und verbindet die Knöpfe mit den passenden Funktionen. Alles steckt in einer sofort ausgeführten Funktion, damit die Namen im Inneren nicht mit anderen Scripts der Seite kollidieren.

const SCHLUESSEL_ANZAHL = "PT_NumToDoList";
const SCHLUESSEL_EINTRAG = "PT_ToDoItem";

Der Browserspeicher funktioniert wie ein Karteikasten: Jede Ablage hat einen Namen (den Schlüssel) und einen Text als Inhalt. Dieses Script benutzt einen Schlüssel für die höchste vergebene Nummer und je einen pro Eintrag — PT_ToDoItem1, PT_ToDoItem2 und so weiter. Die etwas kryptischen Namen stammen noch aus der Cookie-Fassung von 2008 und bleiben absichtlich unverändert, damit alte Einträge nicht verloren gehen.

function lesen(name) {
  try { return localStorage.getItem(name); }
  catch (fehler) { return null; }
}

Drei kleine Hilfsfunktionen kapseln den Zugriff: lesen, schreiben und entfernen. Der try/catch-Block darum herum ist kein Zierrat — in bestimmten Browsereinstellungen (privates Fenster, blockierte Websitedaten) wirft schon der bloße Zugriff auf localStorage einen Fehler. Ohne catch würde das ganze Script an dieser Stelle stehen bleiben; so liefert es einfach null und die Liste bleibt eben leer.

const nummer = hoechsteNummer() + 1;
schreiben(SCHLUESSEL_EINTRAG + nummer, text);
schreiben(SCHLUESSEL_ANZAHL, nummer);

So kommt ein neuer Eintrag hinein: Die bisher höchste Nummer wird um eins erhöht, der Text unter dieser Nummer abgelegt und die neue Höchstnummer notiert. Diese Nummer ist die Hausnummer eines Eintrags — sie ändert sich nie wieder, auch wenn davor etwas gelöscht wird. Deshalb gibt es zwei verschiedene Zahlen im Script: nummer ist der Speicherplatz, platz die laufende Nummer in der Anzeige.

for (let nummer = 1; nummer <= hoechsteNummer(); nummer++) {
  const text = lesen(SCHLUESSEL_EINTRAG + nummer);
  if (text !== null) {
    platz++;
    koerper.appendChild(zeile(text, platz, nummer));
  }
}

Beim Anzeigen läuft die Schleife alle je vergebenen Nummern durch. Gelöschte Plätze liefern null und werden übersprungen — die Liste hat also keine Lücken in der Nummerierung, obwohl im Speicher welche sind. appendChild hängt die fertige Tabellenzeile unten an den Tabellenkörper an.

const inhalt = document.createElement("td");
inhalt.textContent = text;

Die Zeilen werden Stück für Stück mit document.createElement gebaut statt als HTML-Text zusammengeklebt. Das ist etwas mehr Schreibarbeit, hat aber einen handfesten Vorteil: textContent setzt den Text als reinen Text ein. Tippt jemand <b>Milch</b> in das Feld, steht genau das in der Liste — es wird nicht als HTML ausgeführt. Bei innerHTML wäre das anders, und ein Besucher könnte sich fremdes Markup in die eigene Seite schreiben.

function knopf(beschriftung, aufgabe) {
  const element = document.createElement("button");
  element.type = "button";
  element.textContent = beschriftung;
  element.addEventListener("click", aufgabe);
  return element;
}

Jede Zeile braucht zwei Knöpfe, die genau ihren eigenen Eintrag betreffen. Die Funktion knopf baut einen solchen Knopf und hängt gleich die mitgegebene aufgabe an das Klickereignis. Beim Aufruf wird die Aufgabe als kleine Funktion übergeben — function () { loeschen(nummer); } —, die sich die Nummer ihrer Zeile merkt. Solche mitgegebenen Funktionen heißen Callbacks: Sie werden nicht sofort ausgeführt, sondern später, wenn das Ereignis eintritt.

const neu = prompt("Aktion " + platz + " bearbeiten:", alt);
if (neu !== null && neu.trim() !== "") {

prompt() öffnet das kleine Eingabefenster des Browsers; der zweite Wert ist der Text, der schon darin steht. Klickt der Besucher auf „Abbrechen“, gibt prompt den Wert null zurück — dann bleibt alles beim Alten. trim() schneidet Leerzeichen an den Rändern ab, damit niemand versehentlich einen leeren Eintrag speichert.

Zum Anpassen: Die Beschriftungen „Bearbeiten“, „Löschen“ und der Satz „Noch keine Aktion eingetragen.“ stehen direkt als Text im Script und dürfen frei geändert werden. Wollt ihr die Liste pro Unterseite getrennt führen, gebt den beiden Schlüsseln oben einfach unterschiedliche Namen, etwa "PT_ToDoItem_Urlaub".

Script für die eigene Homepage

Kopiert euch den kompletten Code und fügt ihn an der Stelle eurer Seite ein, an der das Script erscheinen soll. Er läuft ohne weitere Dateien und ohne fremde Server.

Mehr aus der Kategorie Verschiedenes