{"id":6727,"date":"2025-01-11T12:33:39","date_gmt":"2025-01-11T12:33:39","guid":{"rendered":"https:\/\/howtogeek.blog\/no\/?p=6727"},"modified":"2025-01-11T12:33:39","modified_gmt":"2025-01-11T12:33:39","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\/no\/create-your-first-web-application-a-beginners-guide-to-building-a-simple-notes-app-and-word-counter\/","title":{"rendered":"Lag din f\u00f8rste nettapplikasjon: En nybegynnerveiledning for \u00e5 bygge en Simple Notes-app og Word-teller"},"content":{"rendered":"<p>\u00c5 starte kodingsreisen kan virke skremmende midt i et overveldende utvalg av spr\u00e5k og rammer. Du kan til og med tenke p\u00e5 \u00e5 la en AI h\u00e5ndtere alt! Likevel kan programmering for nettet v\u00e6re spennende, tilgjengelig og helt gratis!<\/p>\n<h2 id=\"what-youll-build\">Hva du skal bygge<\/h2>\n<p>I denne oppl\u00e6ringen skal du lage en enkel nettapplikasjon designet for \u00e5 lagre tekstnotater mens du teller tegnene og ordene i disse notatene.<\/p>\n<p>Denne applikasjonen lagrer data kontinuerlig, slik at den kan hente tekst selv etter at siden er oppdatert eller \u00e5pnet p\u00e5 nytt. Det er en praktisk l\u00f8sning for \u00e5 opprettholde rask tilgang til viktig tekst, enten det er adresser, URL-er eller noe annet.<\/p>\n<figure class=\"wp-block-image\"><img alt=\"Et eksempel p\u00e5 den enkle tekstnettappen som viser notater inkludert en kalenderoppf\u00f8ring og en liste over nettadresser.\" 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 enkle tekstnettappen som viser notater inkludert en kalenderoppf\u00f8ring og en liste over nettadresser.\" width=\"960\"\/><\/figure>\n<p>Videre sporer appen tegn- og ordtellinger, og gir en utmerket introduksjon til strengmanipulering. Selv om applikasjonen er grunnleggende i design, gir denne oppl\u00e6ringen deg grunnleggende ferdigheter i utvikling av nettapper, og l\u00e5ser opp enorme muligheter innen koding.<\/p>\n<h2 id=\"how-youll-build-it\">Hvordan du bygger det<\/h2>\n<p>Mens nettapplikasjoner kan variere betydelig, integrerer de vanligvis tre essensielle teknologier: HTML, CSS og JavaScript. Hver av disse komponentene har en avgj\u00f8rende funksjon i webutvikling:<\/p>\n<ul>\n<li><strong>HTML:<\/strong> Dette er strukturen til webapplikasjonen din, som fastsl\u00e5r hvordan innhold er organisert. HTML definerer om tekst er et avsnitt, overskrift eller et listeelement.<\/li>\n<li><strong>CSS:<\/strong> Cascading Style Sheets legger stil til innholdet ditt, slik at du kan endre farger, fonter og layout. Du kan bruke CSS til \u00e5 gj\u00f8re elementer fete, justere kanter og plassere elementer p\u00e5 skjermen.<\/li>\n<li><strong>JavaScript:<\/strong> Dette programmeringsspr\u00e5ket er integrert for \u00e5 tilf\u00f8re funksjonalitet til webapplikasjonen din. JavaScript kan skape interaktive opplevelser, som \u00e5 vise\/gjemme elementer eller bygge komplekse applikasjoner som spill.<\/li>\n<\/ul>\n<figure class=\"wp-block-image\"><img alt=\"Hjemmesiden til web.dev-nettstedet med l\u00e6ringsressurser for 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 til web.dev-nettstedet med l\u00e6ringsressurser for HTML, CSS og JavaScript.\" width=\"1388\"\/><\/figure>\n<h2 id=\"the-app-structure\">Appstrukturen<\/h2>\n<p>Programmet du skal bygge best\u00e5r av tre enkle filer: <code>index.html<\/code>, <code>styles.css<\/code>, og <code>script.js<\/code>.<\/p>\n<p>Det finnes ingen avanserte krav for \u00e5 kj\u00f8re denne appen &#8211; bare en nettleser er tilstrekkelig. Siden dette er en frontend-app, er det ikke behov for backend-skriptspr\u00e5k som PHP eller lokale servere. N\u00e5r du er ferdig, \u00e5pner du bare <code>index.html<\/code>i nettleseren din for \u00e5 se appen din i aksjon.<\/p>\n<p>Denne appen bruker Web Storage API for \u00e5 lagre tekst, slik at den kan beholde informasjon uten \u00e5 m\u00e5tte skrive til diskfiler, siden JavaScript mangler filsystemtilgang.<\/p>\n<h2 id=\"how-to-build-the-note-taker\">Hvordan bygge notattakeren<\/h2>\n<p>Begynn med \u00e5 lage de tre n\u00f8dvendige filene i samme katalog. Alternativt kan du laste ned filene fra <a href=\"https:\/\/github.com\/bobbykjack\/text\" target=\"_blank\">dette GitHub-depotet<\/a> .<\/p>\n<h3 id=\"building-the-structure-with-html\">Bygge strukturen med HTML<\/h3>\n<p>Filen <code>index.html<\/code>legger opp appens innholdsstruktur. Den inkluderer referanser til CSS- og JavaScript-filene, slik at nettleseren kan sl\u00e5 dem sammen til en s\u00f8ml\u00f8s opplevelse.<\/p>\n<p>Akkurat som ethvert HTML-dokument, best\u00e5r hovedrammeverket av en hodeseksjon med metadata og en kropp som inneholder innholdet:<\/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>Hoveddelen inneholder korte metadata, inkludert sidetittelen (synlig i nettleserens tittellinje) og en lenke 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 mer detaljert, inkludert n\u00f8kkelkomponenter:<\/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>, identifisert som &#8220;teller&#8221;, inneholder antall ord og tegn. Den forblir p\u00e5 toppen og oppdateres dynamisk etter hvert som teksten endres.<\/p>\n<p>Det er viktig \u00e5 merke seg bruken av <code>id<\/code>attributter \u2013 deres unike verdier hjelper til med \u00e5 style disse elementene og m\u00e5lrette dem for funksjonalitet.<\/p>\n<p>Den <code>textarea<\/code>gir et omr\u00e5de for brukere \u00e5 legge inn tekst med <code>autofocus<\/code>attributtet, noe som sikrer at den er klar for skriving ved sideinnlasting. Til slutt refererer HTML til <code>script.js<\/code>filen.<\/p>\n<p>P\u00e5 dette tidspunktet \u00e5pner du <code>index.html<\/code>i en nettleser. Den vil ikke fungere enn\u00e5 og ser kanskje ikke helt riktig ut, men det er nyttig \u00e5 sjekke fremgangen p\u00e5 hvert trinn.<\/p>\n<figure class=\"wp-block-image\"><img alt=\"En visning av nettappen for notater med standard nettleserstiler, som 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 av nettappen for notater med standard nettleserstiler, som viser alt samlet i \u00f8verste venstre hj\u00f8rne.\" width=\"960\"\/><\/figure>\n<h3 id=\"making-things-look-good-with-css\">F\u00e5 ting til \u00e5 se bra ut med CSS<\/h3>\n<p>Selv om denne grunnleggende appen ikke krever omfattende designjusteringer, kan vi forbedre layouten med litt styling.<\/p>\n<p>F\u00f8rst etablerer vi kroppsstilen for \u00e5 skissere det generelle utseendet:<\/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-en bruker <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\/CSS_grid_layout\" target=\"_blank\">rutenettoppsett<\/a> for \u00e5 ordne antall ord og tegn i en smal rad over tekstomr\u00e5det. Egenskapen <code>grid-template-rows<\/code>bestemmer at telleraden skal ta minst mulig plass (min-innhold) mens tekstomr\u00e5det fyller den gjenv\u00e6rende plassen (1fr).<\/p>\n<p>Tellerraden f\u00e5r grunnleggende styling for \u00e5 skille den fra tekstomr\u00e5det, f\u00f8rst og fremst gjennom bakgrunnen:<\/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 \u00e5 sikre at teksten er lesbar, slik at det er tilstrekkelig hvitt mellomrom:<\/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=\"Notat-appen med tilpassede stiler viser telleverket \u00f8verst med et tekstomr\u00e5de i full 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=\"Notat-appen med tilpassede stiler viser telleverket \u00f8verst med et tekstomr\u00e5de i full st\u00f8rrelse nedenfor.\" width=\"960\"\/><\/figure>\n<h3 id=\"adding-functionality-with-javascript\">Legge til funksjonalitet med JavaScript<\/h3>\n<p>Med grunnlaget lagt ut, er det p\u00e5 tide \u00e5 sette inn funksjonalitet i applikasjonen din \u2013 koden som bringer den til live!<\/p>\n<p>F\u00f8r du g\u00e5r inn i koding, er det viktig \u00e5 skissere den tiltenkte funksjonaliteten. For denne applikasjonen vil du fokusere p\u00e5 to hovedm\u00e5l:<\/p>\n<ul>\n<li>Fortsett og last inn tekst p\u00e5 nytt.<\/li>\n<li>Oppdater tegn- og ordtellinger dynamisk.<\/li>\n<\/ul>\n<p>Disse funksjonene krever oppdateringer av visse dokumentelementer. Begynn derfor med \u00e5 skaffe referanser til disse nodene ved \u00e5 bruke <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>tilsvarer deres respektive seksjoner i dokumentet, identifisert av deres ID-attributter.<\/p>\n<p>Deretter introduserer du interaktivitet ved \u00e5 stille inn appen til \u00e5 svare n\u00e5r teksten endres:<\/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 funksjon til \u00e5 utl\u00f8se n\u00e5r en spesifisert hendelse inntreffer. I dette tilfellet, n\u00e5r brukeren samhandler med tekstomr\u00e5det, utl\u00f8ser &#8220;input&#8221;-hendelsen funksjonen.<\/p>\n<p>Deretter brukes Web Storage API for \u00e5 bevare tekstomr\u00e5dets n\u00e5v\u00e6rende innhold, tilgjengelig via <code>ev.target.value<\/code>. Metoden <code>setItem<\/code>knytter en n\u00f8kkel til dataene som skal lagres.<\/p>\n<p>For \u00e5 sikre at teksten lastes inn n\u00e5r appen initialiseres eller oppdateres, legg til en annen 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 lytteren reagerer p\u00e5 vinduets innlastingshendelse. Ved innlasting av vinduet henter den den lagrede teksten og setter tekstomr\u00e5dets verdi deretter mens den p\u00e5kaller <code>update_counts()<\/code>for \u00e5 oppdatere antall ord og tegn.<\/p>\n<p>Den gjenv\u00e6rende funksjonaliteten ligger i <code>update_counts()<\/code>funksjonen, som ser slik ut:<\/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 motsetning til et tekstomr\u00e5de mangler ren tekst et verdiattributt; dermed <code>innerHTML<\/code>brukes eiendommen i stedet. Egenskapen <code>length<\/code>til en streng henter det totale antall tegn.<\/p>\n<p>For \u00e5 dele teksten inn i ord bruker vi <code>text.split(' ')<\/code>, som deler strengen ved hvert mellomromstegn, og produserer en rekke ord. Lengdeegenskapen til den resulterende matrisen gir antall ord.<\/p>\n<p>Du kan imidlertid st\u00f8te p\u00e5 et par utfordringer med denne koden:<\/p>\n<ol>\n<li>Det vil ikke telle enkeltord p\u00e5 en linje uten omgivende mellomrom.<\/li>\n<li>Hvis ingen tekst er til stede, vil den rapportere et enkelt ord un\u00f8yaktig p\u00e5 grunn av hvordan <code>split<\/code>den fungerer.<\/li>\n<\/ol>\n<p>For \u00e5 l\u00f8se det f\u00f8rste problemet b\u00f8r du vurdere \u00e5 dele p\u00e5 et regul\u00e6rt uttrykk for \u00e5 ta hensyn til mellomrom: <code>\\s<\/code>. For \u00e5 l\u00f8se det andre problemet, filtrer ut eventuelle tomme strenger:<\/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=\"Nettappen med eksempeltekst, som viser n\u00f8yaktige tegn- og ordtellinger.\" class=\"wp-image\" decoding=\"async\" height=\"569\" loading=\"lazy\" src=\"https:\/\/cdn.howtogeek.blog\/wp-content\/uploads\/2025\/01\/web-app-final.webp\" title=\"Nettappen med eksempeltekst, som viser n\u00f8yaktige tegn- og ordtellinger.\" width=\"960\"\/><\/figure>\n<p>\u00c5 lage nyttige webapplikasjoner kan oppn\u00e5s med bare noen f\u00e5 grunnleggende filer! Du kan utvide denne enkle notatappen ved \u00e5 integrere tilleggsfunksjoner, for eksempel \u00e5 bruke <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Window\/location\" target=\"_blank\">egenskapen window.location<\/a> for \u00e5 f\u00e5 tilgang til nettadresser eller la flere notater lagres ved \u00e5 variere navnene som sendes til <code>localStorage.setItem<\/code>.<\/p>\n<h3>Ytterligere innsikt<\/h3>\n<h4><strong>1. Hva er forutsetningene for denne nettappoppl\u00e6ringen?<\/strong><\/h4>\n<p>Alt du trenger er en grunnleggende forst\u00e5else av HTML, CSS og JavaScript. Verkt\u00f8y som et tekstredigeringsprogram (f.eks. VSCode) og en nettleser vil ogs\u00e5 v\u00e6re nyttige.<\/p>\n<h4><strong>2. Kan jeg endre denne nettappen for \u00e5 legge til flere funksjoner?<\/strong><\/h4>\n<p>Absolutt! Denne oppl\u00e6ringen gir et grunnlag. Du kan legge til funksjonalitet som \u00e5 lagre flere notater, kategorisere notater eller til og med implementere en s\u00f8kefunksjon!<\/p>\n<h4><strong>3. Hvordan fungerer Web Storage API?<\/strong><\/h4>\n<p>Web Storage API lar webapplikasjoner lagre data i nettleseren. Den lagrer data i n\u00f8kkelverdi-par som vedvarer selv etter at nettleseren er lukket, noe som gj\u00f8r det enkelt \u00e5 hente ut 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 bilder<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00c5 starte kodingsreisen kan virke skremmende midt i et overveldende utvalg av spr\u00e5k og rammer. Du kan til og med tenke p\u00e5 \u00e5 la en AI h\u00e5ndtere alt! Likevel kan programmering for nettet v\u00e6re spennende, tilgjengelig og helt gratis! Hva du skal bygge I denne oppl\u00e6ringen skal du lage en enkel nettapplikasjon designet for \u00e5 [&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":[878,202,5],"class_list":["post-6727","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\/no\/wp-json\/wp\/v2\/posts\/6727","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/howtogeek.blog\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/howtogeek.blog\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/howtogeek.blog\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/howtogeek.blog\/no\/wp-json\/wp\/v2\/comments?post=6727"}],"version-history":[{"count":1,"href":"https:\/\/howtogeek.blog\/no\/wp-json\/wp\/v2\/posts\/6727\/revisions"}],"predecessor-version":[{"id":6728,"href":"https:\/\/howtogeek.blog\/no\/wp-json\/wp\/v2\/posts\/6727\/revisions\/6728"}],"wp:attachment":[{"href":"https:\/\/howtogeek.blog\/no\/wp-json\/wp\/v2\/media?parent=6727"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/howtogeek.blog\/no\/wp-json\/wp\/v2\/categories?post=6727"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/howtogeek.blog\/no\/wp-json\/wp\/v2\/tags?post=6727"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}