{"id":6861,"date":"2025-01-11T12:34:06","date_gmt":"2025-01-11T12:34:06","guid":{"rendered":"https:\/\/howtogeek.blog\/da\/?p=6861"},"modified":"2025-01-11T12:34:06","modified_gmt":"2025-01-11T12:34:06","slug":"create-your-first-web-application-a-beginners-guide-to-building-a-simple-notes-app-and-word-counter","status":"publish","type":"post","link":"https:\/\/howtogeek.blog\/da\/create-your-first-web-application-a-beginners-guide-to-building-a-simple-notes-app-and-word-counter\/","title":{"rendered":"Opret din f\u00f8rste webapplikation: En begyndervejledning til at bygge en Simple Notes-app og Word-t\u00e6ller"},"content":{"rendered":"<p>At starte din kodningsrejse kan virke skr\u00e6mmende midt i et overv\u00e6ldende udvalg af sprog og rammer. Du kan endda t\u00e6nke p\u00e5 at lade en AI klare alt! Ikke desto mindre kan programmering til nettet v\u00e6re sp\u00e6ndende, tilg\u00e6ngeligt og helt gratis!<\/p>\n<h2 id=\"what-youll-build\">Hvad du vil bygge<\/h2>\n<p>I denne \u00f8velse vil du oprette en simpel webapplikation, der er designet til at gemme tekstnoter, mens du t\u00e6ller tegnene og ordene i disse noter.<\/p>\n<p>Denne applikation gemmer konstant data, hvilket g\u00f8r den i stand til at hente tekst, selv efter at siden er blevet opdateret eller gen\u00e5bnet. Det er en praktisk l\u00f8sning til at opretholde hurtig adgang til vigtig tekst, hvad enten det er adresser, URL&#8217;er eller andet.<\/p>\n<figure class=\"wp-block-image\"><img alt=\"Et eksempel p\u00e5 den simple tekstwebapp, der viser noter, herunder en kalenderpost og en liste over URL'er.\" class=\"wp-image\" decoding=\"async\" height=\"569\" loading=\"lazy\" src=\"https:\/\/cdn.howtogeek.blog\/wp-content\/uploads\/2025\/01\/web-app-example.webp\" title=\"Et eksempel p\u00e5 den simple tekstwebapp, der viser noter, herunder en kalenderpost og en liste over URL'er.\" width=\"960\"\/><\/figure>\n<p>Desuden sporer appen tegn- og ordantal, hvilket giver en fremragende introduktion til strengmanipulation. Selvom applikationen er grundl\u00e6ggende i design, giver denne tutorial dig grundl\u00e6ggende f\u00e6rdigheder til udvikling af webapps, hvilket frig\u00f8r enorme muligheder inden for kodning.<\/p>\n<h2 id=\"how-youll-build-it\">Hvordan du vil bygge det<\/h2>\n<p>Mens webapplikationer kan variere betydeligt, integrerer de typisk tre essentielle teknologier: HTML, CSS og JavaScript. Hver af disse komponenter tjener en afg\u00f8rende funktion i webudvikling:<\/p>\n<ul>\n<li><strong>HTML:<\/strong> Dette er strukturen af \u200b\u200bdin webapplikation, der fastsl\u00e5r, hvordan indhold er organiseret. HTML definerer, om tekst er et afsnit, overskrift eller et listeelement.<\/li>\n<li><strong>CSS:<\/strong> Cascading Style Sheets tilf\u00f8jer stil til dit indhold, s\u00e5 du kan \u00e6ndre farver, skrifttyper og layout. Du kan bruge CSS til at g\u00f8re elementer fed, justere kanter og placere elementer p\u00e5 sk\u00e6rmen.<\/li>\n<li><strong>JavaScript:<\/strong> Dette programmeringssprog er integreret for at tilf\u00f8re funktionalitet i din webapplikation. JavaScript kan skabe interaktive oplevelser, som at vise\/skjule elementer eller bygge komplekse applikationer som spil.<\/li>\n<\/ul>\n<figure class=\"wp-block-image\"><img alt=\"Hjemmesiden for web.dev-webstedet med l\u00e6ringsressourcer til HTML, CSS og JavaScript.\" class=\"wp-image\" decoding=\"async\" height=\"734\" loading=\"lazy\" src=\"https:\/\/cdn.howtogeek.blog\/wp-content\/uploads\/2025\/01\/web-dev-homepage.webp\" title=\"Hjemmesiden for web.dev-webstedet med l\u00e6ringsressourcer til HTML, CSS og JavaScript.\" width=\"1388\"\/><\/figure>\n<h2 id=\"the-app-structure\">App-strukturen<\/h2>\n<p>Den applikation, du er ved at bygge, best\u00e5r af tre enkle filer: <code>index.html<\/code>, <code>styles.css<\/code>, og <code>script.js<\/code>.<\/p>\n<p>Der eksisterer ingen avancerede krav for at k\u00f8re denne app &#8211; kun en webbrowser er tilstr\u00e6kkelig. Da dette er en frontend-app, er der ikke behov for backend-scriptsprog som PHP eller lokale servere. N\u00e5r du er f\u00e6rdig, skal du blot \u00e5bne <code>index.html<\/code>i din browser for at se din app i aktion.<\/p>\n<p>Denne app udnytter Web Storage API til at gemme tekst, hvilket g\u00f8r den i stand til at beholde information uden at skulle skrive til diskfiler, da JavaScript mangler filsystemadgang.<\/p>\n<h2 id=\"how-to-build-the-note-taker\">S\u00e5dan bygger du notetageren<\/h2>\n<p>Begynd med at oprette de tre n\u00f8dvendige filer i samme mappe. Alternativt kan du downloade filerne fra <a href=\"https:\/\/github.com\/bobbykjack\/text\" target=\"_blank\">dette GitHub-lager<\/a> .<\/p>\n<h3 id=\"building-the-structure-with-html\">Opbygning af strukturen med HTML<\/h3>\n<p>Filen <code>index.html<\/code>opstiller din apps indholdsstruktur. Det inkluderer referencer til CSS- og JavaScript-filerne, hvilket giver browseren mulighed for at flette dem sammen til en problemfri oplevelse.<\/p>\n<p>Ligesom ethvert HTML-dokument best\u00e5r hovedrammen af \u200b\u200ben hovedsektion med metadata og en krop, der indeholder indholdet:<\/p>\n<p> <code><br \/>\n<span>&lt;!DOCTYPE html&gt;<\/span><br \/>\n<span>&lt;html&gt;<\/span><br \/>\n<span>&lt;head&gt;<\/span><br \/>\n<span>...&lt;\/head&gt;<\/span><br \/>\n<span>&lt;body&gt;<\/span><br \/>\n<span>...&lt;\/body&gt;<\/span><br \/>\n<span>&lt;\/html&gt;<\/span><br \/>\n<\/code><\/p>\n<p>Hovedafsnittet indeholder korte metadata, herunder sidetitlen (synlig i browserens titellinje) og et link til <code>styles.css<\/code>filen:<\/p>\n<p> <code><br \/>\n<span>&lt;title&gt;Text&lt;\/title&gt;<\/span><br \/>\n<span>&lt;link rel=\"stylesheet\"href=\"styles.css\"\/&gt;<\/span><br \/>\n<\/code><\/p>\n<p>Kroppen er mere detaljeret, herunder n\u00f8glekomponenter:<\/p>\n<p> <code><br \/>\n<span>&lt;div id=\"counter\"&gt;<\/span><br \/>\n<span>words: &lt;span id=\"words\"&gt;0&lt;\/span&gt;<\/span><br \/>\n<span>\/ characters: &lt;span id=\"chars\"&gt;0&lt;\/span&gt;<\/span><br \/>\n<span>&lt;\/div&gt;<\/span><br \/>\n<span>&lt;textarea id=\"text\"autofocus=\"1\"&gt;&lt;\/textarea&gt;<\/span><br \/>\n<span>&lt;script src=\"script.js\"&gt;&lt;\/script&gt;<\/span><br \/>\n<\/code><\/p>\n<p>Elementet <code>div<\/code>, identificeret som &#8220;t\u00e6ller&#8221;, rummer ord- og tegnt\u00e6llingen. Den forbliver \u00f8verst og opdateres dynamisk, n\u00e5r teksten \u00e6ndres.<\/p>\n<p>Det er vigtigt at bem\u00e6rke brugen af <code>id<\/code>\u200b\u200battributter \u2013 deres unikke v\u00e6rdier hj\u00e6lper med at style disse elementer og m\u00e5lrette dem til funktionalitet.<\/p>\n<p>Den <code>textarea<\/code>giver et omr\u00e5de, hvor brugere kan indtaste tekst med <code>autofocus<\/code>attributten, hvilket sikrer, at den er klar til at skrive ved sideindl\u00e6sning. Endelig refererer HTML til <code>script.js<\/code>filen.<\/p>\n<p>P\u00e5 dette tidspunkt skal du \u00e5bne <code>index.html<\/code>i en browser. Det fungerer ikke endnu og ser m\u00e5ske ikke helt rigtigt ud, men det er nyttigt at kontrollere dine fremskridt p\u00e5 hvert trin.<\/p>\n<figure class=\"wp-block-image\"><img alt=\"En visning af noteoptagelseswebappen med standardbrowserstile, der viser alt samlet i \u00f8verste venstre hj\u00f8rne.\" class=\"wp-image\" decoding=\"async\" height=\"569\" loading=\"lazy\" src=\"https:\/\/cdn.howtogeek.blog\/wp-content\/uploads\/2025\/01\/web-app-no-style.webp\" title=\"En visning af noteoptagelseswebappen med standardbrowserstile, der viser alt samlet i \u00f8verste venstre hj\u00f8rne.\" width=\"960\"\/><\/figure>\n<h3 id=\"making-things-look-good-with-css\">F\u00e5 tingene til at se godt ud med CSS<\/h3>\n<p>Selvom denne grundl\u00e6ggende app ikke kr\u00e6ver omfattende designjusteringer, kan vi forbedre dens layout med lidt styling.<\/p>\n<p>F\u00f8rst etablerer vi kropsstilen for at skitsere det overordnede udseende:<\/p>\n<p> <code><br \/>\n<span>body {<\/span><br \/>\n<span> margin: 0;<\/span><br \/>\n<span> padding: 0;<\/span><br \/>\n<span> display: grid;<\/span><br \/>\n<span> min-height: 100vh;<\/span><br \/>\n<span> grid-template-rows: min-content 1fr;<\/span><br \/>\n<span>}<\/span><br \/>\n<\/code><\/p>\n<p>Denne CSS anvender <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\/CSS_grid_layout\" target=\"_blank\">gitterlayout<\/a> til at arrangere ord- og tegnantal i en smal r\u00e6kke over tekstomr\u00e5det. Egenskaben <code>grid-template-rows<\/code>bestemmer, at t\u00e6ller\u00e6kken skal tage mindst mulig plads (min-indhold), mens tekstomr\u00e5det fylder den resterende plads (1fr).<\/p>\n<p>T\u00e6llerr\u00e6kken modtager grundl\u00e6ggende styling for at adskille den fra tekstomr\u00e5det, prim\u00e6rt gennem dens baggrund:<\/p>\n<p> <code><br \/>\n<span>#counter {<\/span><br \/>\n<span> font-family: sans-serif;<\/span><br \/>\n<span> background-color: #f7f7f7;<\/span><br \/>\n<span> text-align: center;<\/span><br \/>\n<span> width: 100%;<\/span><br \/>\n<span> padding: 0 0.5em 0;<\/span><br \/>\n<span>}<\/span><br \/>\n<\/code><\/p>\n<p>Tekstomr\u00e5det er stylet for at sikre, at teksten er l\u00e6selig, hvilket giver mulighed for tilstr\u00e6kkelig hvid plads:<\/p>\n<p> <code><br \/>\n<span>textarea {<\/span><br \/>\n<span> width: 100%;<\/span><br \/>\n<span> height: 100%;<\/span><br \/>\n<span> font-size: 16pt;<\/span><br \/>\n<span> padding: 1em;<\/span><br \/>\n<span> box-sizing: border-box;<\/span><br \/>\n<span> outline: 0;<\/span><br \/>\n<span> border: none;<\/span><br \/>\n<span> border-top: 1px solid #999;<\/span><br \/>\n<span>}<\/span><br \/>\n<\/code><\/p>\n<figure class=\"wp-block-image\"><img alt=\"Note-appen med tilpassede stilarter viser t\u00e6llerlinjen \u00f8verst med et tekstomr\u00e5de i fuld st\u00f8rrelse nedenfor.\" class=\"wp-image\" decoding=\"async\" height=\"569\" loading=\"lazy\" src=\"https:\/\/cdn.howtogeek.blog\/wp-content\/uploads\/2025\/01\/web-app-with-style.webp\" title=\"Note-appen med tilpassede stilarter viser t\u00e6llerlinjen \u00f8verst med et tekstomr\u00e5de i fuld st\u00f8rrelse nedenfor.\" width=\"960\"\/><\/figure>\n<h3 id=\"adding-functionality-with-javascript\">Tilf\u00f8jelse af funktionalitet med JavaScript<\/h3>\n<p>Med grundlaget lagt, er det tid til at tilf\u00f8je funktionalitet i din applikation \u2013 koden, der bringer den til live!<\/p>\n<p>F\u00f8r du dykker ned i kodning, er det vigtigt at skitsere den tilsigtede funktionalitet. For denne ans\u00f8gning vil du fokusere p\u00e5 to prim\u00e6re m\u00e5l:<\/p>\n<ul>\n<li>Forts\u00e6t og genindl\u00e6s indtastet tekst.<\/li>\n<li>Opdater tegn- og ordtal dynamisk.<\/li>\n<\/ul>\n<p>Disse funktioner kr\u00e6ver opdateringer af visse dokumentelementer. Begynd derfor med at indhente referencer til disse noder ved hj\u00e6lp af <code>getElementById<\/code>metoden:<\/p>\n<p> <code><br \/>\n<span>const words = document.getElementById(\"words\");<\/span><br \/>\n<span>const chars = document.getElementById(\"chars\");<\/span><br \/>\n<span>const textarea = document.getElementById(\"text\");<\/span><br \/>\n<\/code><\/p>\n<p>Her, <code>words<\/code>, <code>chars<\/code>, og <code>textarea<\/code>svarer til deres respektive sektioner i dokumentet, identificeret ved deres ID-attributter.<\/p>\n<p>Indf\u00f8r derefter interaktivitet ved at indstille appen til at reagere, n\u00e5r teksten \u00e6ndres:<\/p>\n<p> <code><br \/>\n<span>textarea.addEventListener(\"input\", function(ev) {<\/span><br \/>\n<span> localStorage.setItem(\"text\", ev.target.value);<\/span><br \/>\n<span> update_counts(ev.target.value);<\/span><br \/>\n<span>});<\/span><br \/>\n<\/code><\/p>\n<p>Metoden <code>addEventListener<\/code>binder en funktion til at udl\u00f8se, n\u00e5r en specificeret h\u00e6ndelse opst\u00e5r. I dette tilf\u00e6lde, n\u00e5r brugeren interagerer med tekstomr\u00e5det, udl\u00f8ser &#8220;input&#8221;-h\u00e6ndelsen funktionen.<\/p>\n<p>Dern\u00e6st bruges Web Storage API til at bevare tekstomr\u00e5dets nuv\u00e6rende indhold, der tilg\u00e5s via <code>ev.target.value<\/code>. Metoden <code>setItem<\/code>knytter en n\u00f8gle til de data, der skal lagres.<\/p>\n<p>For at sikre, at teksten indl\u00e6ses, n\u00e5r appen initialiseres eller opdateres, skal du tilf\u00f8je en anden lytter:<\/p>\n<p> <code><br \/>\n<span>window.addEventListener(\"load\", function(ev) {<\/span><br \/>\n<span> var text = localStorage.getItem(\"text\");<\/span><br \/>\n<span> textarea.value = text;<\/span><br \/>\n<span> update_counts(text);<\/span><br \/>\n<span>});<\/span><br \/>\n<\/code><\/p>\n<p>Denne lytter reagerer p\u00e5 vinduets indl\u00e6sningsh\u00e6ndelse. N\u00e5r vinduet indl\u00e6ses, henter den den gemte tekst og indstiller tekstomr\u00e5dets v\u00e6rdi i overensstemmelse hermed, mens den p\u00e5ber\u00e5ber sig <code>update_counts()<\/code>for at opdatere antallet af ord og tegn.<\/p>\n<p>Den resterende funktionalitet ligger i <code>update_counts()<\/code>funktionen, som ser s\u00e5dan ud:<\/p>\n<p> <code><br \/>\n<span>function update_counts(text) {<\/span><br \/>\n<span> chars.innerHTML = text.length;<\/span><br \/>\n<span> words.innerHTML = text.split(' ').length;<\/span><br \/>\n<span>}<\/span><br \/>\n<\/code><\/p>\n<p>I mods\u00e6tning til et tekstomr\u00e5de mangler almindelig tekst en v\u00e6rdiattribut; s\u00e5ledes <code>innerHTML<\/code>bruges ejendommen i stedet. Egenskaben <code>length<\/code>for en streng henter det samlede antal tegn.<\/p>\n<p>For at dele teksten op i ord, bruger vi <code>text.split(' ')<\/code>, som deler strengen ved hvert mellemrumstegn, hvilket producerer en r\u00e6kke ord. L\u00e6ngdeegenskaben for det resulterende array angiver antallet af ord.<\/p>\n<p>Du kan dog st\u00f8de p\u00e5 et par udfordringer med denne kode:<\/p>\n<ol>\n<li>Det vil ikke t\u00e6lle enkelte ord korrekt p\u00e5 en linje uden omgivende mellemrumstegn.<\/li>\n<li>Hvis der ikke er nogen tekst til stede, vil den rapportere et enkelt ord un\u00f8jagtigt p\u00e5 grund af, hvordan <code>split<\/code>den fungerer.<\/li>\n<\/ol>\n<p>For at l\u00f8se det f\u00f8rste problem kan du overveje at opdele p\u00e5 et regul\u00e6rt udtryk for at tage h\u00f8jde for mellemrumstegn: <code>\\s<\/code>. For at afhj\u00e6lpe det andet problem skal du filtrere eventuelle tomme strenge fra:<\/p>\n<p> <code><br \/>\n<span> words.innerHTML = text.split(\/\\s\/).filter(function(n) { return n! = ''; }).length;<\/span><br \/>\n<\/code><\/p>\n<figure class=\"wp-block-image\"><img alt=\"Webappen med eksempeltekst, der viser n\u00f8jagtige tegn- og ordt\u00e6llinger.\" class=\"wp-image\" decoding=\"async\" height=\"569\" loading=\"lazy\" src=\"https:\/\/cdn.howtogeek.blog\/wp-content\/uploads\/2025\/01\/web-app-final.webp\" title=\"Webappen med eksempeltekst, der viser n\u00f8jagtige tegn- og ordt\u00e6llinger.\" width=\"960\"\/><\/figure>\n<p>Oprettelse af nyttige webapplikationer kan opn\u00e5s med blot nogle f\u00e5 grundl\u00e6ggende filer! Du kan udvide denne enkle note-app ved at integrere yderligere funktioner, s\u00e5som at bruge <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Window\/location\" target=\"_blank\">egenskaben window.location<\/a> til at f\u00e5 adgang til URL&#8217;er eller tillade, at flere noter gemmes ved at variere de navne, der sendes til <code>localStorage.setItem<\/code>.<\/p>\n<h3>Yderligere indsigt<\/h3>\n<h4><strong>1. Hvad er foruds\u00e6tningerne for denne webapp-vejledning?<\/strong><\/h4>\n<p>Alt du beh\u00f8ver er en grundl\u00e6ggende forst\u00e5else af HTML, CSS og JavaScript. V\u00e6rkt\u00f8jer som en teksteditor (f.eks. VSCode) og en webbrowser vil ogs\u00e5 v\u00e6re nyttige.<\/p>\n<h4><strong>2. Kan jeg \u00e6ndre denne webapp for at tilf\u00f8je flere funktioner?<\/strong><\/h4>\n<p>Absolut! Denne tutorial giver et grundlag. Du kan tilf\u00f8je funktionalitet s\u00e5som at gemme flere noter, kategorisere noter eller endda implementere en s\u00f8gefunktion!<\/p>\n<h4><strong>3. Hvordan fungerer Web Storage API?<\/strong><\/h4>\n<p>Web Storage API tillader webapplikationer at gemme data i browseren. Det gemmer data i n\u00f8gle-v\u00e6rdi-par, der forts\u00e6tter, selv efter at browseren er lukket, hvilket g\u00f8r det nemt at hente senere.<\/p>\n<p><a class=\"xiaomi\" href=\"https:\/\/www.howtogeek.com\/build-your-first-web-app-a-simple-word-counter\/\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Kilde og billeder<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>At starte din kodningsrejse kan virke skr\u00e6mmende midt i et overv\u00e6ldende udvalg af sprog og rammer. Du kan endda t\u00e6nke p\u00e5 at lade en AI klare alt! Ikke desto mindre kan programmering til nettet v\u00e6re sp\u00e6ndende, tilg\u00e6ngeligt og helt gratis! Hvad du vil bygge I denne \u00f8velse vil du oprette en simpel webapplikation, der er [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[879,205,9],"class_list":["post-6861","post","type-post","status-publish","format-standard","hentry","category-how-to","tag-apps-web-apps","tag-programming","tag-windows"],"acf":[],"_links":{"self":[{"href":"https:\/\/howtogeek.blog\/da\/wp-json\/wp\/v2\/posts\/6861","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/howtogeek.blog\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/howtogeek.blog\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/howtogeek.blog\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/howtogeek.blog\/da\/wp-json\/wp\/v2\/comments?post=6861"}],"version-history":[{"count":1,"href":"https:\/\/howtogeek.blog\/da\/wp-json\/wp\/v2\/posts\/6861\/revisions"}],"predecessor-version":[{"id":6862,"href":"https:\/\/howtogeek.blog\/da\/wp-json\/wp\/v2\/posts\/6861\/revisions\/6862"}],"wp:attachment":[{"href":"https:\/\/howtogeek.blog\/da\/wp-json\/wp\/v2\/media?parent=6861"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/howtogeek.blog\/da\/wp-json\/wp\/v2\/categories?post=6861"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/howtogeek.blog\/da\/wp-json\/wp\/v2\/tags?post=6861"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}