Civil & Strukturell teknik
Skapa en Javascript Bookmark Manager med lokal lagringsuthållighet
Table of Contents
Förstå grunderna
Att bygga en bokmärkeshanterare med JavaScript och Web Storage API är ett utmärkt projekt för att behärska grundläggande front-end-koncept. I sin kärna måste programmet hantera tre primära operationer: ]] skapa ], ]] läsning ] och ]]]]]]] - ett klassiskt CRUD-mönster, minusuppdateringar för nu.
Innan du skriver en enda rad kod, stärker du din förståelse för följande pelare:
- DOM API:] Du kommer att fråga element, lyssna på händelser och manipulera dokumentträdet för att visa bokmärken dynamiskt.
- localStorage:[] Denna nyckelvärdebutik behåller data även efter att webbläsaren är stängd. Den stöder bara strängar, så objekt måste serialiseras med och deserialiseras med ].
- Event-driven programmering: ] Formerna avger ] händelser; ta bort knappar eld ] händelser. Mastering ] är icke-förhandlingsbart.
- ]Array metoder: ], ]]], och ]]]] kommer att hjälpa till att göra och manipulera bokmärken lista effektivt.
Bygga Core Bookmark Manager
HTML-struktur
Börja med en minimal, semantisk HTML skelett. Formen samlar bokmärkets namn och URL; en oordnad lista gör de lagrade bokmärkena.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bookmark Manager</title>
</head>
<body>
<h1>My Bookmarks</h1>
<form id="bookmarkForm">
<label for="name">Name</label>
<input type="text" id="name" required />
<label for="url">URL</label>
<input type="url" id="url" required />
<button type="submit">Add Bookmark</button>
</form>
<ul id="bookmarkList"></ul>
<script src="app.js" defer></script>
</body>
</html>
Lägg märke till ] attributet på manusetiketten - det säkerställer att DOM är helt parsed innan manuset körs, vilket eliminerar behovet av en omslag i moderna inställningar.
Styling för användbarhet (Valfritt men rekommenderat)
Medan CSS inte är fokus, förbättrar ett rent gränssnitt användarupplevelsen. Lägg till ett enkelt formatblad för att utrymme ut formuläret, ge knapparna ett konsekvent utseende och stil bokmärkeslistan objekt med svävar effekter. Minimal inline styling kan också injiceras via JavaScript, men en separat är att föredra för underhållbarhet.
<!-- inside <head> -->
<link rel="stylesheet" href="style.css" />
I ], använd flexbox för formulärlayouten, en maximal bredd för behållaren och distinkt visuell återkoppling för att ta bort knappar för att förhindra oavsiktliga klick.
JavaScript Logic - Hjärtat av applicationen
Alla uthållighet och interaktivitet lever i ]. Följande avsnitt bryter ner varje funktion.
Datainitialisering
Vi behöver en central variabel som håller den aktuella listan över bokmärken. Den bör initieras från ] eller falla tillbaka till en tom array.
let bookmarks = [];
function loadBookmarks() {
const stored = localStorage.getItem('bookmarks');
if (stored) {
bookmarks = JSON.parse(stored);
} else {
bookmarks = [];
}
}
function saveBookmarks() {
localStorage.setItem('bookmarks', JSON.stringify(bookmarks));
}
loadBookmarks();
Funktionen ] kallas varje gång arrayändringarna - efter att ha lagt till, redigera eller ta bort ett bokmärke. Detta säkerställer att lagringen alltid synkroniseras med in-memory array.
Visa bokmärken
Att göra bokmärkeslistan betyder att iterera över ]] array och skapa listobjekt med en ankartag och en raderingsknapp.
function renderBookmarks() {
const list = document.getElementById('bookmarkList');
list.innerHTML = ''; // clear existing entries
bookmarks.forEach(function(bookmark, index) {
const li = document.createElement('li');
li.dataset.index = index;
const link = document.createElement('a');
link.href = bookmark.url;
link.textContent = bookmark.name;
link.target = '_blank';
link.rel = 'noopener noreferrer';
const deleteBtn = document.createElement('button');
deleteBtn.textContent = 'Delete';
deleteBtn.addEventListener('click', function() {
deleteBookmark(index);
});
li.appendChild(link);
li.appendChild(deleteBtn);
list.appendChild(li);
});
}
Använda ] istället för innerHTML undviker XSS-sårbarheter när bokmärkesnamn innehåller HTML. Ta bort knappen använder en stängning för att fånga bokmärkets index.
Lägga till ett bokmärke
Lyssna på formulärets ] händelse, förhindra att standardsidan laddas, skapa ett bokmärke objekt, tryck den till matrisen, kvarstå och återlämna.
document.getElementById('bookmarkForm').addEventListener('submit', function(e) {
e.preventDefault();
const nameInput = document.getElementById('name');
const urlInput = document.getElementById('url');
const newBookmark = {
name: nameInput.value.trim(),
url: urlInput.value.trim()
};
// Basic validation: ensure URL starts with http/https
if (!newBookmark.url.startsWith('http://') && !newBookmark.url.startsWith('https://')) {
newBookmark.url = 'https://' + newBookmark.url;
}
bookmarks.push(newBookmark);
saveBookmarks();
renderBookmarks();
// Reset form
nameInput.value = '';
urlInput.value = '';
nameInput.focus();
});
Detta tillvägagångssätt är enkelt. För produktionen kanske du vill validera URL-formatet ytterligare med hjälp av ] konstruktör eller en regex.
Ta bort ett bokmärke
Avtagning tar bort objektet i det angivna indexet och uppdateringar lagring och DOM.
function deleteBookmark(index) {
bookmarks.splice(index, 1);
saveBookmarks();
renderBookmarks();
}
Med muterar arrayen på plats. Om du föredrar oföränderlighet, kan du använda ] och omfördela ]], men för ett litet projekt som detta är ] klar och performant.
Förbättra tillämpningen
När grund CRUD fungerar, överväga dessa förbättringar för att förvandla en prototyp till ett robust verktyg.
Redigera bokmärken
Byt ut det statiska namnet / länken med ett inline-redigeringsläge. När användaren klickar på en redigeringsknapp byter du ankaret med inmatningsfält som är förfyllda med de aktuella värdena. På spara, uppdatera arrayen och kvarstår.
Implementationstips: lägg till en ]-funktion som skapar redigerbara ingångar. Använd ] händelsedelegation[]] på listan för att hantera redigering sparar utan att fästa flera lyssnare.
Kategorisering med taggar
Lägg till en valfri egendom till varje bokmärke objekt (t.ex. ])]) Därefter förlänga UI med en filteringång som döljer listobjekt vars taggar inte matchar. Du kan lagra taggar som en komma-separerad sträng inuti formuläret och dela dem i en matris.
Import och export
Tillåt användare att säkerhetskopiera eller överföra bokmärken. Använd en ] eller en nedladdning av filen. Export serialiserar ] i en JSON-sträng och utlöser en nedladdning via ] och ]]]. Import läser JSON och sammanfogar med befintliga bokmärken.
function exportBookmarks() {
const data = JSON.stringify(bookmarks, null, 2);
const blob = new Blob([data], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'bookmarks.json';
a.click();
URL.revokeObjectURL(url);
}
Sök och filtrera
Lägg till en ingång ovanför bokmärkeslistan. På varje händelse, filtrera ] array med namn (eller URL) och ring en variant av ] som endast visar matcherna. För att undvika att förlora den ursprungliga listan, lagra en filtrerad kopia eller använd en beräknad parameter.
Testning och webbläsare kompatibilitet
localStorage stöds i alla moderna webbläsare, men äldre versioner av Internet Explorer (IE 8+) hade ett annat API. Om du måste stödja äldre miljöer, testa med polyfills eller falla tillbaka till cookies. Dagens ]] Chrome, Firefox, Safari, Edge (både krom och arv) hantera och ] utan problem.
När du testar, verifiera:
- Data överlever siduppdateringar och webbläsare startar om.
- Ta bort en bokmärke uppdateringar både UI och lagring.
- Särskilda tecken i bokmärkesnamn (citat, ampersands) görs korrekt.
- URL:er med och utan ] normaliseras.
Använd utvecklarverktyg[]] > Application > Lagring > Lokal lagring för att inspektera sparade data manuellt.
För automatisk testning, överväga att använda ]] Cypress] eller ]]] För att simulera användararbetsflöden — fyll i formulär, lägg till, ta bort, ladda om — och hävda att listan persistor.
Slutsats
Detta projekt visar hur några dussin rader av vanilj JavaScript kan skapa en fullt fungerande, ihållande webbapplikation. Du har lärt dig att utnyttja localStorage API ] för data ihållande, ]] händelsedelegation ]] för effektiva UI-uppdateringar, och ] CRUD-operationer utan en backend-grund som du tillämpade - inledande av lagring av statsreglering av ramverkande, murmensfunktioner, mutrörning av
För att fördjupa din förståelse, utforska ] MDN-dokumentation på lokallagring ]] och läs om ]]] händelsehantering i DOM]. För mer avancerad statlig förvaltning, titta in ]]]] IndexedDB] för större datamängder eller ]]] servicearbetare än för offline-första upplevelser.