Front End utveckling
Om Front End Utveckling
Front End utveckling kurs dokumentation samt sammanfattande cheatsheets
- Ordning på information följer kursen
- Extern referens ges till viktig information
- Utfasad punketer från kursen kommer inte inkluderas
Tenten
Information som behövs inför tenten
Tenten Teoretisk
- Nio frågor
- Utantill-frågor, inga hjälpmedel
- Görs med Penna och papprer
- Under övervakning
1. Good Coding Habits
Från HTML delen
- Best HTML Coding Practices You Must Know
- Kapitel 1 - HTML
-
- Skriv alltid läsbar och välstrukturerad kod
-
- Bra indentering
-
- Avsluta alltid element (Bra att sätta slut element när man skapar start element)
-
- Använd beskrivande filnamn
-
- “Onion rings” princip för nästling
-
- Kontrollera matematiken för dimensioner
-
- Avänd beskrivande kommentarer
-
- Testa regelbundet i webbläsaren
-
- Organiserad mappstruktur
-
- Korrekt formatering av innehåll
-
- Tydlig separation mellan sektioner
-
- Validera alla länkar
-
- Använd konsekventa färgkoder
Från CSS delen
- CSS Best Practices For Clean Code
- Kapitel 2 - CSS
-
- Använd beskrivande klassnamn
-
- Följ etablerade namnkonventioner
-
- Håll CSS organiserad
-
- Undvik inline styling när möjligt
-
- Definera default värden i body
-
- Separera HTML från formatering
-
- Kommentera viktiga sektioner
-
- Implementera responsiva designprinciper
Från XML delen
- XML Programming Best Practices
- Kapitel 3 - XML
-
- Skriv alltid läsbar och välstrukturerad kod
-
- Bra element namn
-
- Bra indentering
-
- Avsluta alltid element
-
- “Onion rings” princip för nästling
Från JS delen
- JavaScript Best Practices
- Kapitel 4 - JavaScript
-
- På gång
-
- Om nån har bra punkter från kursen här skriv i Discord eller fråga efter rättigheter att göra en pull request :)
2. HTML-syntax
- Basic HTML syntax
- Kapitel 1 - HTML
- Mer detaljer på HTML Cheatsheet
-
<!DOCTYPE html> <!-- Vilken HTML version --> <html lang="sv"> <!-- Alltid har root element <html>--> <head> <!-- Metadata och länkar till andra filer --> <title>Hemsida</title> <!-- Sida titel (Kan se på tabb i webbläsare)--> <link rel="stylesheet" href="style.css"> </head> <body> <!-- Webbsidans innehåll --> <h1>Hemsida</h1> <p>Lorem ipsum...<br> Ipsum lorem... </p> <script src="index.js"></script> </body> </html>
3. Tabeller, rowspan, colspan
- 03 HTML 2 - Övning 1 och inlämningsuppgift 1
- Bra beskrivet på HTML Cheatsheet
4. Containers
- 07 CSS 2 - Övning 5
- 03 HTML 2 - Övning 1 och inlämningsuppgift 1
- Container tags
- CSS Cheatsheet: Positioner, Synlighet, Z-index
- HTML Cheatsheet: Element/Taggar, Nästling, Attribut
5. XML-dokumentstruktur
- 10 XML 1 - Teori och övning 8
- Bra beskrivet på XML Cheatsheet
6. XML och Stylesheets
- 11 XML 2 - Övning 9-10
- Bra beskrivet på XML Cheatsheet
7. DOM
- 15 Javascript 2 - Övning 14
- DOM(Document Object Model)
8. JavaScript, finn fem fel
- Öva på JavaScript
- Hjälp från JS Cheatsheet
9. JavaScript, förklara programmet
- Öva på JavaScript
- Hjälp från JS Cheatsheet
Tenten Praktisk
- Utför en programmeringsuppgift
- Kursmaterial, anteckningar, internet får använda
- Man får INTE rådfråga en annan människa, man måste hitta lösningarna själv
- Får utföras hemma
1. Good Coding Habits
- Samma punkt som Tenten teoretisk del.
2. Skapa en/flera HTML-sidor
- 02 HTML 1 - Teoretisk bakgrun och första testet
3. Med korrekt tabell-struktur(er)
- 03 HTML 2 - Övning 1 och inlämningsuppgift 1
4. Och korrekt CSS-instruktioner
- Gå över hur CSS kopplas med element, id, class
5. Som innehåller minst ett formulär
- 15 JavaScript 2 - Övning 14
6. Kopplat till JavaScript-kontroll
- 16 JavaScript 3 - Övning 15
7. Som kommer att utföra uppgifter
- 17 JavaScript 4 - Övning 16
- 18 JavaScript 5 - Övning 17
8. uppdelat i ett antal nästlade funktioner
- Kapitel 4 - JavaScript
Tenten Extra
När lärare sa att nånting var viktit till tenten
HTML Hur man räknar colspan och rowspan, Front End 03 övn1 Part 1 45:00 övning 5 vid 2 30:00
CSS Beskriva positions i CSS Övning 5 CSS2 7:00 viktiga: relativi och absolut kommer beskrivas i tenten
XML
XSL inte språk, XSLT är språket, XSL innehåller 3 komponenter. XSL r stora skalet där XSLT är en av de tre delarna.
XHTML:
Alla element ska stängas
xml är case sensitive
onion rings
attribut ges alltid med =“värde”. (apostrofer)
<html>
har bar ett rootelement och ingenting finns utanför
xml namespace
doctype, i provet kolla video FRONT END 12 XML3
HTML (HyperText Markup Language)
https://www.w3schools.com/html/default.asp
HTML Cheatsheet
- HTML (HyperText Markup Language) är ett markup språk, inte ett programmeringsspråk
- Används för att beskriva struktur, metainformation och innehåll på webbsidor
- HTML och överförs mellan server och klient med HTTP-protokollet
- Utvecklades i början av 90-talet
- Element/Taggar
-
- Omges av vinkelparenteser
<>
- Omges av vinkelparenteser
-
- Måste alltid ha start- och sluttagg
<tag></tag>
och får inte lämnas öppen
- Måste alltid ha start- och sluttagg
-
- Självstängande taggar slutar med
/>
(t.ex.<img />
)
- Självstängande taggar slutar med
-
- Ges alltid med gemener(Lowercase)!
<ELEMENT> </ELEMENT>
är fel
- Ges alltid med gemener(Lowercase)!
- Nästling
-
- Element måste stängas i ordning (“onion rings” princip)
-
- Får inte korsa varandra
-
-
<tag1> <tag2> <tag3>Text</tag3> </tag2> </tag1>
-
- Attribut
-
- Ger extra information till element
-
- Snyax: attribut=“värde”
-
- Värden måste omslutas av citattecken
-
<element attribut="värde"></element>
- HTML-dokument boilerplate
-
-
<!DOCTYPE html> <html> <!-- Alltid börjar med html tagg --> <head> <!-- Innehåller meta information och länkade filer som ex. stylesheet --> <title>Hello World Site!</title> </head> <body> <!-- Dokument utsende och innehåll --> </body> </html>
-
- Alltid läsbar och välstrukturerad kod med bra kommentar
- Använ beskrivande filnamn (index.html för startsida)
- Tabell
<table> </table>
användes för struktur men nu för tiden används<div> </div>
containers och tabells är bra för data uppvisning -
- Tabell elementer med attrubuter
-
-
<!-- Tabell start --> <!-- Bra att kommentera så att man ser strukturen tydligare --> <table border="0" cellspacing="0" cellpadding="0"> <!-- border - Tabellens ram (0 = ingen ram) cellspacing - Avstånd mellan celler cellpadding - Avstånd inom celler --> <tr> <!-- Table row som är bestämmer rader i tabell --> <td width="100" height="100" align="center" valign="center"></td> <!-- Table Data/Cell som bestämmer column i tabell--> <!-- width - Cellens bredd i pixlar height - Cellens höjd i pixlar bgcolor - Bakgrundsfärg (#RRGGBB) align - Horisontell justering (left, center, right) valign - Vertikal justering (top, middle, bottom) --> </tr> <tr> <td colspan="2" rowspan="1"></td> <!-- colspan - Antal kolumner cellen spänner över rowspan - Antal rader cellen spänner över --> </tr> </table> <!-- Tabell slut -->
-
- Kontrollera att matematik för dimensioner stämmer (Kan använda papper och penna för att rita ut)
- Bilder på HTML sidan hämtas med image embed element
<img src="/images/bild.png" />
. Används första/
om man har bilder vid rooten annars inga backslash om det är på samma mapp. - Testa regelbunder i webbläsaren att se till allt funkars om det ska.
- Att byta rad används line break
<br>
element - Paragraph för att dela innehåll med en tom linje
<p> Lorem ipsum... </p>
- Heading element att representera olika rubrik nivåer
<h1>-<h6>
. Ex.<h1>Rubrik</h1>
- Anchor element används för att länka till andra URL addresser som kan vara samma sida eller exten sida. Man ger addressen med href attribut
<a href="https://google.com"> Den är en länk </a>
-
-
<!-- Länk attributer --> link="#123456" <!-- Olänkad --> vlink="#123456" <!-- Besökt --> alink="#123456" <!-- Aktiv -->
-
-
- Bra praxis att verifjera länkar
Kurs Sammanfattning
HTML 1
HTML 1 Teori
- HTML (HyperText Markup Language) är ett märkspråk, inte ett programmeringsspråk
- Används för att beskriva struktur och innehåll på webbsidor
- Utvecklades i början av 90-talet
Viktiga Koncept
-
Element/Taggar
- Omges av vinkelparenteser
< >
- Måste alltid ha start- och sluttagg
<tag></tag>
- Självstängande taggar slutar med
/>
(t.ex.<img />
)
- Omges av vinkelparenteser
-
Nästling
- Element måste stängas i ordning (“onion rings” princip)
- Får inte korsa varandra
<tag1> <tag2> <tag3>Text</tag3> </tag2> </tag1>
-
Attribut
- Ger extra information till element
- Syntax:
attribut="värde"
- Värden måste omslutas av citattecken
<element attibut="värde"></element>
Grundstruktur HTML-dokument
<!DOCTYPE html>
<html>
<head>
<title>Sidtitel</title>
</head>
<body>
<!-- Innehåll -->
</body>
</html>
Bra att veta
- Skriv alltid läsbar och välstrukturerad kod
- Använd konsekvent indentering
- Avsluta alltid element
- Använd beskrivande filnamn (index.html för startsida)
HTML 2 (part 1)
HTML 2 (part 1) - Tabeller för Layout
Grundprinciper för Tabeller
- Används för layout (historiskt, nu används containers
<div> </div>
) - Måste planera struktur noggrant
- Mätningar är viktiga för korrekt layout (Kan rita på papper)
Tabell Attribut
<table border="0" cellspacing="0" cellpadding="0">
border
- Tabellens ram (0 = ingen ram)cellspacing
- Avstånd mellan cellercellpadding
- Avstånd inom celler
Tabell Element
<table>
<tr> <!-- Table Row -->
<td></td> <!-- Table Data/Cell -->
</tr>
</table>
Cell Attribut
width
- Cellens bredd i pixlarheight
- Cellens höjd i pixlarbgcolor
- Bakgrundsfärg (#RRGGBB)colspan
- Antal kolumner cellen spänner överrowspan
- Antal rader cellen spänner överalign
- Horisontell justering (left, center, right)valign
- Vertikal justering (top, middle, bottom)
Bra att veta
- Använd kommentarer för att markera sektioner
- Indentera koden för läsbarhet
- Stäng alltid element direkt efter öppning
- Kontrollera att matematik för dimensioner stämmer
Exempel på Layout Struktur
<!-- Header start -->
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td height="30" colspan="2"><!-- Tomt utrymme --></td>
</tr>
<tr>
<td width="50"><!-- Vänster margin --></td>
<td width="293"><img src="images/logo.gif" /></td>
</tr>
<tr>
<td height="30" colspan="2"><!-- Nedre margin --></td>
</tr>
</table>
<!-- Header slut -->
Bra att veta
- Alltid avsluta element
- Använd “onion rings” princip för nästling
- Kontrollera matematiken för dimensioner
- Använd beskrivande kommentarer
- Testa regelbundet i webbläsaren
HTML 2 (part 2)
HTML 2 (part 2) - Nästlade Tabeller
-
Yttre Tabell
- Används för huvudsaklig layout
- Kontrollerar avstånd till webbläsarens kanter
<table border="0" cellspacing="0" cellpadding="0"> <tr> <td width="110"><!-- Avstånd vänster --></td> <td width="1" bgcolor="#000000"><!-- Svart vertikal linje --></td> <td width="756"><!-- Huvudinnehåll --></td> <td width="1" bgcolor="#000000"><!-- Svart vertikal linje --></td> </tr> </table>
-
Mellan Tabell
- Hanterar kolumnindelning
- Skapar avstånd mellan sektioner
<table> <tr> <td width="30"><!-- Avstånd --></td> <td width="166" valign="top"><!-- Foto sektion --></td> <td width="135" valign="top"><!-- Variabler --></td> <td width="245" valign="top"><!-- Värden --></td> <td width="182"><!-- Tom cell --></td> </tr> </table>
-
Inre Tabeller
- Hanterar specifikt innehåll
- Separata tabeller för:
- Foto/Employee code
- Variabler (namn, födelsedatum etc.)
- Värden (personlig information)
Bra att veta för Nästlade Tabeller
- Använd konsekventa indentering för olika nivåer
- Kontrollera matematiken för dimensioner
- Använd kommentarer för att markera tabellnivåer
- Testa varje tabell separat innan nästling
<!-- Inre tabell start -->
<table>
<tr>
<td><!-- Innehåll --></td>
</tr>
</table>
<!-- Inre tabell slut -->
- Viktiga Attribut
width
- Exakta pixelmått viktigaheight
- Kontrollerar radavståndbgcolor
- Bakgrundsfärger (#RRGGBB)valign
- “top” för konsekvent alignmentcolspan
/rowspan
- För cell-sammanslagning
Viktigt att Tänka På
- Matematiken måste stämma mellan nivåer
- Använd konsekvent struktur
- Testa regelbundet i webbläsaren
- Dokumentera tabellstrukturen
HTML 2 (part 3)
HTML 2 (part 3) - Kompletterande Sektioner
-
Additional Information Sections
- Background
- Strengths
- Weaknesses
-
Struktur för Extra Sektioner
<!-- Grön balk --> <table border="0" cellspacing="0" cellpadding="0"> <tr> <td width="756" height="30" bgcolor="#274F26" align="left" valign="middle"> <font size="4" face="arial" color="#FFFFFF"> <b> Background</b> </font> </td> </tr> </table> <!-- Innehållstabell --> <table border="0" cellspacing="0" cellpadding="0"> <tr> <td width="30"><!-- Avstånd vänster --></td> <td width="696"><!-- Innehåll --></td> <td width="30"><!-- Avstånd höger --></td> </tr> </table>
-
Text Formatering
-
Använd
<br>
för radbrytningar -
Använd
<p></p>
för styckeindelning -
Font-attribut:
<font size="2" face="arial" color="#123456"> Text innehåll </font>
-
Inlämningskrav
- Filnamn:
itXX-YY.html
(employee code) - Bildfil:
itXX-YY.jpg/png/gif
- Placering:
- HTML-fil i root
- Bilder i
/photos/
mapp - Layout-bilder i
/images/
mapp
- Filnamn:
Bra att veta
- Konsekvent namnstandard
- Organiserad mappstruktur
- Korrekt formatering av innehåll
- Tydlig separation mellan sektioner
HTML 3
HTML 3 - Personalregister
- Syfte
- Skapa en översiktssida för alla anställda
- Länka till individuella personalsidor
- Konsekvent formatering och layout
- Struktur
- Huvudtabell med kolumner för:
-
- Employee Code
-
- Signature Date
-
- Name
-
- Rank
-
- Access Level
- Varje rad länkar till personlig sida
- Viktiga Element
<a href="itXX-YY.html">Namn</a> <!-- Länkar -->
<td colspan="5"> <!-- Kolumnspann -->
<font size="4" color="#000000"> <!-- Textformatering -->
- Färgkoder
-
Länkar (i body-elementet):
link="#123456" <!-- Olänkad --> vlink="#123456" <!-- Besökt --> alink="#123456" <!-- Aktiv -->
Bra att veta
- Validera alla länkar
- Kontrollera matematiken för tabellbredder
- Använd konsekventa färgkoder
- Säkerställ korrekt formatering
Viktigt att Tänka På
- Alla anställda måste finnas med
- Korrekt employee code för varje person
- Fungerande länkar till personliga sidor
- Konsekvent formatering genom hela dokumentet
HTML 4 (part 1)
HTML 4 (part 1) - Navigeringsmeny och Sociala Media
- Förändringar i Layout
- Borttagning av gröna balkar
- Införande av navigeringsmeny
- Tillägg av sociala media ikoner
- Integration av kontaktuppgifter
- Sociala Media Integration
<!-- Social media icons -->
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="40" align="center">
<a href="https://facebook.com">
<img src="images/social_fb.gif" alt="Facebook" />
</a>
</td>
<!-- Repeat for other social media icons -->
</tr>
</table>
- Kontaktinformation
- Företagsnamn
- Telefonnummer
- Faxnummer
- E-postadress
- Webbadress
- Navigeringsmeny
- Company Presentation
- History
- Board of Directors
- Personnel Registry
Bra att veta
- Konsekvent användning av pixelmått
- Korrekt cellpadding för visuell balans
- Välstrukturerad nästling av tabeller
- Tydlig separation mellan sektioner
Viktiga Koncept
- Matematisk precision i tabellayout
- Korrekt hantering av cellspacing
- Användning av ikoner och länkar
- Integration av multipla designelement
HTML 4 (part 2)
HTML 4 (part 2) - Back-knapp
- Placering och Design
- Del av huvudmenyn
- Grön bakgrund (samma som meny)
- Bara synlig på undersidor
- Leder tillbaka till huvudsida/överordnad sida
- Inre tabell med rund ikon
- Struktur
<!-- Back knapp start -->
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="32" height="32" bgcolor="#274F26" align="center" valign="middle">
<a href="index.html">
<img src="images/menu_back.png" alt="Back" />
</a>
</td>
</tr>
</table>
<!-- Back knapp slut -->
- Dimensioner
- Knapp: 32x32 pixlar
- Ikon: 22x22 pixlar
- Centrerad vertikalt och horisontellt
Bra att veta
- Konsekvent användning av pixelmått
- Korrekt centrering av ikon
- Tydlig länkstruktur
- Logisk placering i layout
Viktigt att Tänka På
- Ska inte visas på startsida
- Korrekt länkning till överordnad sida
- Exakt matchning av färger och mått
- Symmetrisk placering i menyn
CSS (Cascading Style Sheets)
https://www.w3schools.com/css/default.asp
CSS Cheatsheet
- CSS (Cascading Style Sheets) som beskriver hur dokument skriven i HTML eller XML ser ut.
-
- Separerar innehåll (HTML) från utseende (CSS)
- Man väljer element, class eller id med attribute selector
-
- Använd alltid beskrivande class-, id namn
-
-
selector { /* Info på vad man vill ändra */ property: value; /* Info på vad man ska ändra */ property2: value2; } /* Element selector */ body { background-color: #123456; font-family: Arial, Verdana, Geneva, Helvetica; font-size: 12px; color: #FFFFFF; } /* Klass selector ges med en punkt */ .huvud-menu { padding: 30px; } /* ID selector ges med en hashtag */ #telefon-nummer { width: 150px; } /* Man kan specificiera selector med flera selectors */ h1 .rubrik { font-size: 44pt; }
-
- Förenkla underhåll och uppdateringar
-
- Inline HTML som skrivs direkt i element
<div style="font-size: 12pt; color: #000000;>Text ändrat med CSS</div>"
. Undvik inline styling när möjligt
- Inline HTML som skrivs direkt i element
-
- Internal som placeras i head av HTML dokument med style element
-
-
<html> <head> <style> #id-attribut { padding: 1rem; font-size: 44pt; } </style> </head> <body> <div id="id-attribut"> Lorem ipsum... </div> </body> </html>
-
-
- Man kan ha extern fil som innehåller css som hämtas med link element. Dokumentetet slutar alltid med .css
<link href="/css/index.css" rel="stylesheet" />
- Man kan ha extern fil som innehåller css som hämtas med link element. Dokumentetet slutar alltid med .css
- Pseudo-classes låter dig utforma ett specifikt tillstånd
-
-
a:link { /* Länkar som är inte besökt */ color: #FFFFFF; text-decoration: none; } a:active { /* När länker är nedtrykt */ color: #AAD037; } a:visited { /* Länkar som är besökt */ color: #FFFFFF; } a:hover { /* När man har muspekaren på länken */ color: #AAD037; text-decoration: underline; }
-
- Text formatering / styling med CSS
-
-
p { font-family: Arial, sans-serif; /* Vilken typ av font / text style */ font-size: 12px; /* Text storlek */ color: #000000; /* Text färg */ } a { text-decoration: none; /* Tar bort stadard style från länk */ }
-
- Positioner som bestäm er hur ett element är placerat i ett dokument
-
-
/* Static (default) */ div { position: static; /* Följer normal dokumentflöde */ } /* Relative */ div { position: relative; /* Kan justeras från normal position */ display: block; float: left; } /* Absolute */ div { position: absolute; /* Positioneras mot närmaste ancestor */ } /* Fixed */ div { position: fixed; /* Fast position i viewport */ }
-
- Synlighet kan bestämmas med visibility eller display
-
-
/* Alternativ 1: Visibility */ .element { visibility: hidden; /* Tar upp plats men osynlig */ visibility: visible; /* Synlig */ } /* Alternativ 2: Display */ .element { display: none; /* Tar ingen plats, osynlig */ display: block; /* Synlig, tar plats */ }
-
- Z-index bestämmer vilken ordning synns på skärmen
-
-
/* Default */ z-index: auto; /* Värde */ z-index: 0; z-index: 3; z-index: 289; z-index: -1;
-
Kurs Sammanfattning
CSS 1 (part 1)
Grundprinciper för CSS
Syfte
- Separera innehåll (HTML) från utseende (CSS)
- Centralisera formatering
- Förenkla underhåll och uppdateringar
Syntax
selector {
property: value;
property2: value2;
}
Selektorer
- Element (
table
,div
) - Klass (
.classname
) - ID (
#idname
) - Element med klass (
div.classname
)
Placering av CSS
- Inline HTML (style-attribut)
- Internal (style-element i head)
- External (separat .css-fil)
Implementation
Inline CSS
<div style="font-size: 12pt; color: black;">
Text innehåll
</div>
Internal CSS
<style type="text/css">
.infotext {
font-size: 12pt;
color: black;
}
</style>
External CSS
<link rel="stylesheet" href="style.css">
Viktigt att tänka på
- Använd beskrivande klassnamn
- Håll CSS organiserad och kommenterad
- Följ etablerade namnkonventioner
- Undvik inline styling när möjligt
CSS 1 (part 2)
Body Element och Default CSS
Body Element
body {
background-color: #123456; /* istället för bgcolor i HTML */
font-family: Arial, Verdana, Geneva, Helvetica; /* istället för face */
font-size: 12px;
color: #FFFFFF;
}
Länkar
a:link {
color: #FFFFFF;
text-decoration: none;
}
a:active {
color: #AAD037;
}
a:visited {
color: #FFFFFF;
}
a:hover {
color: #AAD037;
text-decoration: underline;
}
Viktiga CSS Koncept
-
Pseudoklasser
:link
- olänkad:visited
- besökt:active
- aktiv:hover
- muspekare över
-
Text Formattering
font-family
för typsnittfont-size
för textstorlekcolor
för textfärgtext-decoration
för understreck
Bra att veta
- Använd konsekventa färgkoder
- Definiera default värden i body
- Pseudoklasser för interaktivitet
- Separera HTML från formattering
CSS 2
CSS 2 - Responsiv Design
Från Tabeller till Containers
- Fördelar med Containers
- Anpassar sig efter skärmstorlek
- Kan brytas och omorganiseras
- Mer flexibel layout
- Bättre för mobila enheter
- Position Egenskaper
/* Static (default) */
position: static; /* Följer normal dokumentflöde */
/* Relative */
position: relative; /* Kan justeras från normal position */
/* Absolute */
position: absolute; /* Positioneras mot närmaste ancestor */
/* Fixed */
position: fixed; /* Fast position i viewport */
- Container Layout
.container {
position: relative;
display: block;
float: left;
}
Viktigt att Tänka På
- Undvik tabeller för layout
- Använd containers för flexibel design
- Planera brytpunkter
- Testa på olika skärmstorlekar
Best Practices
- Använd beskrivande klassnamn
- Håll CSS organiserad
- Kommentera viktiga sektioner
- Följ konsekventa namnkonventioner
CSS 3
CSS 3 - Dropdown Menyer
Z-index och Lager
- Z-index Principer
- Definierar elementens ordning i höjdled
- Högre värde = visas överst
- Fungerar endast med positionerade element
- Lägsta värdet längst ner, högsta överst
- Synlighet i CSS
/* Alternativ 1: Visibility */
.element {
visibility: hidden; /* Tar upp plats men osynlig */
visibility: visible; /* Synlig */
}
/* Alternativ 2: Display */
.element {
display: none; /* Tar ingen plats, osynlig */
display: block; /* Synlig, tar plats */
}
Dropdown Meny Implementation
/* Grundcontainer för dropdown */
.menu-drop-item {
display: none;
position: absolute;
z-index: 1;
}
/* Hover effekt som visar dropdown */
.menu-item:hover .menu-drop-item {
display: block;
}
/* Dropdown knapp stil */
.menu-drop-text {
height: 30px;
min-width: 180px;
text-align: left;
padding-left: 15px;
padding-right: 15px;
vertical-align: middle;
border: 1px solid black;
background-color: #AAD037;
}
Viktigt att Tänka På
- Korrekt nästling av element
- Konsekvent namngivning av klasser
- Z-index för korrekt lagerordning
- Hantering av hover events
Best Practices
- Testa menyns funktion grundligt
- Verifiera alla länkar
- Säkerställ konsekvent design
- Validera HTML och CSS
CSS 4
CSS 4 - Left Side Menu
Sitemap Implementation
- Menu Structure
- Fixed position left menu
- Default hidden (width: 0)
- Expands on click
- Contains site navigation links
- Basic Components
/* Menu Button */
.menu-button-container {
position: absolute;
top: 0;
left: 0;
z-index: 2;
}
/* Sidebar Layout */
.sidebar {
height: 100%;
width: 0;
position: fixed;
z-index: 3;
top: 0;
left: 0;
overflow-x: hidden;
transition: 0.5s;
padding-top: 50px;
}
- JavaScript Integration
function openMenu() {
document.getElementById("leftSideBar").style.width = "220px";
}
function closeMenu() {
document.getElementById("leftSideBar").style.width = "0";
}
Best Practices
- Centralize JavaScript in separate files
- Use consistent naming conventions
- Implement proper z-index layering
- Handle menu transitions smoothly
Key Points
- Separate content from functionality
- Maintain clean, organized code
- Use proper file structure
- Implement responsive design principles
XML (eXtensible Markup Language)
https://www.w3schools.com/xml/default.asp
XML Cheatsheet
- XML (Extensible Markup Language) markupspråk som linkar HTML
- Skillnad från HTML och XML är man defineiera egna element
<minelement></minelement>
- Används främst för datalagring och datautbyte
- Håller på att ersättas av JSON
- XML är striktare än HTML (ex. går inte att ha felaktiga element ordning)
-
-
<?xml version="1.0" encoding="UTF-8"?> <!-- XML declartion där metadata defineras --> <rotelement> <!-- Ett och endast ett rotelement --> <element-a>Innehåll</element-a> <!-- Alla element måste ha start- och sluttagg --> <element-b attribut="värde"/> <!-- Attribut värden måste omslutas av citattecken --> <element-C> <!-- Case-sensitive --> <subelement>Innehåll</subelement> <!-- Hierarkisk struktur - element får inte korsa varandra--> </element-C> </rotelement>
-
- XML Encoding för att bestämma unicode karaktär som man kan använda i dokumentet. Beroende på encoding typ kan det ha mer eller mindre fil storlek
-
- UTF-8 (8 bitar): Begränsad, inga skandinaviska tecken
-
- ISO-8859-1: Inkluderar skandinaviska tecken
-
- UTF-16 (16 bitar): Större teckenuppsättning
-
- Unicode (21 bitar): Stöd för 144,000 tecken
-
- Attribut i metadata
<?xml version="1.0" encoding="ISO-8859-1" ?>
- Attribut i metadata
- XML kan stylas med CSS
-
- Kopplas till CSS fil med processing instruction
<?xml-stylesheet type="text/css" href="style.css"?>
- Kopplas till CSS fil med processing instruction
-
- Selector är samma som i HTML. element, class, id
- XSLT (eXtensible Stylesheet Language Transformations) som konverterar XML dokument till andra dokumenter som HTML, PDF, vanlig text osv.
-
- Spearat fil som slutar med .xsl
-
- Kopplas till XSLT fil med processing instruction i XML fil
<?xml-stylesheet type="text/xsl" href="file.xsl"?>
- Kopplas till XSLT fil med processing instruction i XML fil
-
-
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <xsl:stylesheet version="1.0" xmlns:xsl="..."> <xsl:template match="/"> <!-- Transformationsregler här --> </xsl:template> </xsl:stylesheet>
-
- XTHML är som en HTML dokument med XML regler
-
- Alla element måste stängas (även tomma element)
-
- Case-sensitive (små bokstäver för HTML-element)
-
- Korrekt ordningsföljd för element
-
- Attribut måste ha värden med citattecken
-
- HTML måste vara rotelement
-
- HTML elementet måste ha XML namespace attribut
-
- DOCTYPE måste vara första raden
-
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <?xml version="1.0" encoding="UTF-8"?> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US"> <head> <title>XHTML</title> </head> <body> <p>I am a XHTML document</p> </body> </html>
-
-
- Kan testa med W3C Markup Validation Service
- XML DTD Att sätta regler för XML dokument syntax
-
- Sparat fil som slutar med .dtd
-
- Kopplas med att deklarera vid DOCTYPE
<!DOCTYPE note SYSTEM "file.dtd">
- Kopplas med att deklarera vid DOCTYPE
-
-
<!DOCTYPE rootElement [ <!ELEMENT elementName (innehåll)> <!ATTLIST elementName attributName type value> ]>
-
-
- Element deklartioner
-
- Attribut deklartioner
-
- Innehållsdeklartioner
-
- Enteties
-
- PCDATA
-
- CDATA
-
- Frekvensmarkörer
- XSD är struktur / schema för XML att bygga på och kan definera datatyper
Kurs Sammanfattning
XML 1 (part 1)
XML 1 (part 1) - Introduktion
- Ett markupspråk som liknar HTML
- Skillnad från HTML: I XML definierar man egna element
- Används främst för datalagring och datautbyte mellan system
- Håller på att ersättas av JSON i moderna system
Grundregler för XML
- Ett och endast ett rotelement
- Alla element måste ha start- och sluttagg
- Hierarkisk struktur - element får inte korsa varandra
- Case-sensitive
- Värden måste omslutas av citattecken
XML Dokument struktur
<?xml version="1.0" encoding="UTF-8"?>
<rotelement>
<element-a>Innehåll</element-a>
<element-b attribut="värde"/>
<element-c>
<subelement>Innehåll</subelement>
</element-c>
</rotelement>
Encoding typer
- UTF-8 (8 bitar): Begränsad, inga skandinaviska tecken
- ISO-8859-1: Inkluderar skandinaviska tecken
- UTF-16 (16 bitar): Större teckenuppsättning
- Unicode (21 bitar): Stöd för 144,000 tecken
XML 1 (part 2)
XML 1 (part 2) - Export till XML från PDF
PDF Exchange Editor
- Installera PDF Exchange Editor (gratis version)
- Öppna PDF dokumenten
- Exportera till XML via Form > Export Form Data
- Spara enligt naming convention (t.ex. employee code)
Excel som XML-verktyg
- Importera XML filer via Data > Get Data > From File > XML
- Använd Power Query Editor för att:
- Ta bort oönskade namespace
- Korrigera datatyper till text
- Rensa/byta kolumnnamn
- Sammanfoga queries med Append
- Bryt data connection genom copy-paste values
Skapa XML Map för Export
- Aktivera Developer tab i Excel
- Skapa XML schema fil med struktur:
<?xml version="1.0"?>
<personnelRegistry>
<employee>
<employeeCode/>
<name/>
<!-- övriga element -->
</employee>
<employee/>
</personnelRegistry>
- Koppla XML Map till kolumner
- Exportera till slutgiltig XML fil
XML 1 (part 3)
XML 1 (part 3) - XML Export med Adobe Acrobat
Adobe Acrobat metoden
- Öppna Adobe Acrobat
- Använd “Merge data files into spreadsheet” under Find
- Välj alla PDF filer och exportera till XML
- Resulterar i en sammanslagen XML-fil
XML Map i Excel
- Skapa XML schema för mappning:
<?xml version="1.0" encoding="UTF-8"?>
<personnelRegistry>
<employee>
<employeeCode/>
<name/>
<!-- andra element -->
</employee>
<employee/>
</personnelRegistry>
- Aktivera Developer tab
- Använd XML Maps för att koppla schema till data
- Exportera till XML-fil
Tips för XML Export
- Bryt query-koppling genom copy-paste values
- Använd XML Map med minst två employee-element
- Skapa separata filer per anställd
- Namnge filer enligt employeeCode
- Kontrollera namespace och elementordning
XML 2
XML 2 - Styling med CSS och XSLT
CSS för XML
- XML kan stylas med CSS för enkel formatering
- Koppla CSS till XML med processing instruction:
<?xml-stylesheet type="text/css" href="style.css"?>
- Begränsad funktionalitet jämfört med XSLT
- Exempel på CSS selektorer för XML:
- Rotelement (motsvarar body)
- Element (motsvarar div/span)
- Attribut
XSLT (eXtensible Stylesheet Language Transformations)
- Kraftfullare verktyg än CSS för XML-formatering
- Del av XSL (eXtensible Stylesheet Language)
- Kan transformera XML till andra format (t.ex. HTML)
- Stödjer programmeringskoncept som:
- Loopar (for-each)
- Villkor (if/choose)
- Sortering
XSLT Grundstruktur
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="...">
<xsl:template match="/">
<!-- Transformationsregler här -->
</xsl:template>
</xsl:stylesheet>
Säkerhetsaspekter
- Webbläsare blockerar lokal XSLT-transformering av säkerhetsskäl
- Lösningar:
- Använd webbserver
- Lightweight lokal server (t.ex. lighttpd)
- Inaktivera säkerhetsbegränsningar (rekommenderas ej)
XML 3
XML 3 - XHTML och Validering
XHTML Regler
- Alla element måste stängas (även tomma element)
- Case-sensitive (små bokstäver för HTML-element)
- Korrekt ordningsföljd för element
- Attribut måste ha värden med citattecken
- HTML måste vara rotelement
- HTML elementet måste ha XML namespace attribut
- DOCTYPE måste vara första raden
Namespace (xmlns)
- Definierar tillgängliga element
- Exempel på namespace-deklaration:
<html xmlns="http://www.w3.org/1999/xhtml">
- Namespace status i olika HTML-versioner:
- XHTML: Obligatoriskt
- HTML4: Ej tillåtet
- HTML5: Valfritt
DOCTYPE
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
Validering
- W3C Markup Validation Service
- W3C CSS Validation Service
- Validering möjlig via:
- URL
- Filuppladdning
- Direktinmatning av kod
XML 4
XML 4 - DTD (Document Type Definition)
DTD Grundprinciper
- Regelbok för XML-element
- Definierar:
- Tillåtna element
- Elementens struktur
- Obligatoriska element
- Elementens innehållstyper
DTD Komponenter
- Element deklarationer
- Attribut deklarationer
- Innehållsdeklarationer
- Entiteter
DTD Syntax
<!DOCTYPE rootElement [
<!ELEMENT elementName (innehåll)>
<!ATTLIST elementName attributName type value>
]>
Innehållstyper
- PCDATA (Parsed Character Data)
- CDATA (Character Data)
- EMPTY (tomt element)
- Nästlade element
Frekvensmarkörer
*
= noll eller flera+
= en eller flera?
= noll eller en- (ingen markör) = exakt en
Koppling till XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rootElement SYSTEM "filename.dtd">
XSD
- Modernare alternativ till DTD
- Använder XML-syntax
- Mer kraftfull validering
- Bättre stöd för datatyper
JS (JavaScript)
https://www.w3schools.com/js/default.asp
JS Cheatsheet
- JS (JavaScript) är en skriptspråk som tolkas av webbläsaren
- Skapad 1995 av Brendan Eich (Netscape)
- Kommunicerar med DOM (Document Object Model)
- JavaScript kompileras JIT (Just In Time)
- Olika webbläsare kör JavaScript kod med olika JavasScript Engines
-
- Chrome: V8
-
- Firefox: SpiderMonkey
-
- Edge: Chakra
-
- Safari: JavaScriptCore / Nitro / SquirrelFish
- Kan skrivas JavaScript direkt i HTML fil med script tagg
<script language="javascript"> alert("Hello World!"); </script>
- Kan länkas extern JavaScript kod som skrivs i filer med .js på slutet
<script language="javascript" src="fil.js"> </script>
-
-
// fil.js console.log("Du har kopplat till en JavaScript Fil :)"); // Skriver ut i konsolen (inspect i browser) alert("Meddelande"); // Popup meddelande var svar = prompt("Vad heter du?"); // Skriver in svar som sparas på variabel svar.
-
- Man kan deklarera variabler som håller värde
-
var
Global omfattning, kan tilldelas om, behövs inte sätta en värde från början
-
let
Blockomfattning, kan tilldelas om
-
const
Blockomfattning, kan inte tilldelas om
- Funktioner kan skapas i JavaScript som kör en block av kod när det anropas. Man kan sätta in parameter att användas i funktionen och returnera värde som man vill få från funktionen.
-
-
// Sätter in två parametrar och ger tillbaks summan av båda parametrar function exempel(param1, param2) { let sum = param1 + param2; return sum; }
-
- If satse som returnerar om kondition är truthy / sant och else om det är inte sant
-
-
var a = true; // Vi sätter a som sant if (a) { // a är sant så körs det console.log("true!! 100%"); console.log("true!! 100%"); } else { // Om a är false då kör kod som är i else console.log("false!! Liar!"); }
-
- Switch sats utvärderar om uttrycket är sant
-
-
switch(uttryck) { case x: // kod break; default: // kod }
-
- Loopar och iterationer används att köra kod flera gånger.
-
- For loop upprepas till villkor är falsk.
-
-
for (initialization; condition; afterthought) statement for (let i = 0; i < 10; i++) { // Sätter variabel för att loopa genom, tills man möter villkor, updaterar variabel när loopen är klar // kod som ska upprepas }
-
-
- Do while loop Kör kodet åtminstone en gång och slutar tills villkor är falsk.
-
-
do statement while (condition); do { // Körs åtminstone en gång // kod som körs och eventuellt upprepas } while (villkor); // Om vilkor är sant kör loopen
-
-
- While statement Loopar så länge vilkor är sant.
-
-
while (condition) statement while(villkor) { // Om vilkor är sant kör loopen // Kod kom körs }
-
-
- For each Loopar genom alla element i räckan
-
-
const array1 = ["a", "b", "c"]; array1.forEach((element) => console.log(element)); // Expected output: "a" // Expected output: "b" // Expected output: "c" array.forEach(item => { // Item är varje element i räckan // Gör nånting med element i räckan });
-
- Man kan köra en funktion i HTML med event attribut
-
-
<html> <head> <script language="javascript"> // Funktion som kör en poppup med meddelande "Hello :)" function hello() { alert("Hello :)"); } </script> </head> <body> <!-- När man klickar på knappen körs funktionen som skapades i head script --> <button onClick="hello()">Hello!</button> </body> </html>
-
- Object är en variabel som innehåller flera egenskaper och metoder. Extra: Constructor
-
-
const pet = // Skapar en pet object med variabler type, name och age samt metod getFacts { type: "Cat", name: "SamSam", age: "8", getFacts: function() { return this.name + " the " + this.type + ", " + this.age + " yrs"; } }; const petType = pet.type; // Cat const petFacts = pet.getFacts(); // Cat the SamSam, 8 yrs
-
- Man kan manipulera DOM med JavaScript
-
-
// Create the root element var root = document.createElement("root"); // Create a child element var child = document.createElement("child"); // Add the child element to the root element root.appendChild(child); // <div id="elementWithId"></div> var elementWithId = document.getElementById("elementWithId");
-
- Man kan skapa en form i HTML och sätta logiken för det med JavaScript
-
-
<html> <head> <script language="javascript"> function inputFormCheck() { // Funktion som checkar om input är inte tom if (document.form.name.value == "") { alert("You must give a Name!"); } if (document.form.email.value == "") { alert("You must give a Email!"); } } </script> </head> <body> <!-- Om man klickar "Subscribe!" då körs funktionen som kollar om infogad information är inte tom, om det är fyllt skickas information till subscribed_page.html URL query --> <form action="subscribed_page.html" method="get" name="form" onsubmit="return inputFormCheck()" > <div class="form-example"> <label for="name">Enter your name: </label> <input type="text" name="name" id="name" required /> </div> <div class="form-example"> <label for="email">Enter your email: </label> <input type="email" name="email" id="email" required /> </div> <div class="form-example"> <input type="submit" value="Subscribe!" /> </div> </form> </body> </html>
-
-
- När man använder form ska man vara medveten om Client-Side och Server-Side
-
- Man kan ha XSS-attacker med form
- Man kan generera slumpmässiga värde med
Math.random * max
- Query sträng används för att överföra variabler i URL address
- Hämta en query sträng från URL kan man använda
window.location.search.substring(1)
-
-
-
// Att hämta en query med namn password let query = window.location.search.substring(1); let vars = query.split('&'); for (let i = 0; i < vars.length; i++) { let pairs = vars[i].split('='); if (pairs[0] === 'password') { document.getElementById('password').value = pairs[1]; } }
-
- Encryption bevarar hela meddelandets innehåll. Resultatets längd beroende på innehållets längd. Kan de-krypteras och innehållet återskapas.
- Hashing räknar ut en ”signatur” för innehållet och ger alltid lika långt resultat oavsett innehållets storlek. Utifrån hashen kan datainnehållet inte återskapas. One way process.
- MD5 – Message Digest Algorithm. Upphovsman Rinald Rivest 1991. 2008 konstaterades att MD5 var “cryptographically broken and unsuitable for further use“. Stor användning fortfarande för hash checksum på nerladdade filer etc, men inte för lösenords”kryptering”.
- SHA-256 SHA1 utvecklades av NSA 1995, påminner om föregångaren MD5 160 bit hash
- SHA2-family
-
- SHA-256 bit hash
-
- SHA-512 bit hash
- Ajax (Asynchronous JavaScript And XML) / XMLHttpRequest Kan updatera information på en webbsida utan att sidan laddas om.
- CORS - Cross-Origin Resource Sharing Av säkerhetsskäl begränsar webbläsare kors ursprung. HTTP-förfrågningar initierade från skript
- Date() Som representerar en moment i tiden som räknas från January 1, 1970, UTC (epoch)
-
-
console.log(new Date(8.64e15).toString()); // "Sat Sep 13 275760 00:00:00 GMT+0000 (Coordinated Universal Time)" console.log(new Date(8.64e15 + 1).toString()); // "Invalid Date"
-
- setTimout() method Väntar millisekunder innan function exekveras
-
-
<script> function myFunction() { alert('Hello'); } </script> <button onclick="setTimeout(myFunction, 3000)">Try it</button>
-
- Fetch API “Fetch is just a simplified way of doing things for most types of XMLHttpRequests”
- JQuery is a fast, small, and feature-rich JavaScript library. It makes things like HTML document traversal and manipulation, event handling, animation, and Ajax much simpler with an easy-to-use API that works across a multitude of browsers
-
-
<head> <script src="jquery-3.6.0.min.js"></script> <!-- Basic syntax: $(selector).action() $(document).ready(function() { }); --> </head>
-
- XML Parser Läser in XML som DOM-object
-
-
<!DOCTYPE html> <!-- <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <registry> <user> <username>Daniel</username> </user> <user> <username>Finn</username> </user> </registry> --> <html> <head> <script language="javascript"> function getList() { var xmlhttp = new XMLHttpRequest(); xmlhttp.onload = function () { var xmlDoc = this.responseXML; var HTMLtxt = ""; const registry = xmlDoc.getElementsByTagName("registry"); const users = registry[0].getElementsByTagName("user"); for (var i = 0; i < users.length; i++) { HTMLtxt += "<div class='name'>" + users[i].getElementsByTagName("username")[0].childNodes[0].nodeValue + " </div>"; } document.getElementById("list").innerHTML = HTMLtxt; } xmlhttp.open("GET", "./data.xml", true); xmlhttp.send(); } </script> </head> <body onload="getList()"> <div id="list"></div> </body> </html>
-
- JSON (JavaScript Object Notation) JSON är en syntax för att serialisera objekt, arrayer, tal, strängar, booleaner och null.
-
-
{ "browsers": { "firefox": { "name": "Firefox", "pref_url": "about:config", "releases": { "1": { "release_date": "2004-11-09", "status": "retired", "engine": "Gecko", "engine_version": "1.7" } } } } }
-
Kurs Sammanfattning
JS 1 (del 1)
JS (del 1) - Grunder & Frontend
Mål
- Komma igång med JavaScript-programmering
- Lära sig grundprinciperna för JavaScript
Bakgrund & Kontext
- Webbapplikation för Tricel
- Behov av dynamisk funktionalitet
- Frontend-del som förberedelse för större applikation
Funktionaliteter som ska byggas
- Inloggningsfunktion med säkerhetsnivåer (A, B, C)
- Personalregister med CRUD-operationer
- Integrerad kalkylator
- Virusdatabas med CRUD-funktionalitet
- Teamchattfunktion
JavaScript Grunder
- Skapad 1995 av Brendan Eich (Netscape)
- Skriptspråk som tolkas av webbläsaren
- Kommunicerar med DOM (Document Object Model)
- JIT (Just In Time) kompilering
- Asynkron exekvering
Webbläsare & JavaScript Engines
- Chrome: V8
- Firefox: SpiderMonkey
- Edge: Chakra
- Safari: Nitro
Kodimplementering
- Kan skrivas direkt i HTML via
<script>
taggar - Kan länkas som externa .js-filer
- Kan testas i webbläsarens konsol
- Exempel på grundläggande syntax:
console.log("Hello World");
alert("Meddelande");
prompt("Vad heter du?");
JS 1 (del 2)
JS (del 2) - Grundläggande Syntax
Variabeldeklaration
var
- Global omfattning, kan tilldelas omlet
- Blockomfattning, kan tilldelas omconst
- Blockomfattning, kan inte tilldelas om
Funktioner
function exempel(param1, param2) {
return param1 + param2;
}
Kontrollstrukturer
- If-satser:
if (villkor) {
// kod
} else if (villkor2) {
// kod
} else {
// kod
}
- Switch-satser:
switch(uttryck) {
case x:
// kod
break;
default:
// kod
}
Loopar
- For-loop:
for (let i = 0; i < 10; i++) {
// kod
}
- Do-while-loop:
do {
// kod
} while (villkor);
- For-each:
array.forEach(item => {
// kod
});
Händelser
- Vanliga triggers:
- onClick
- onChange
- onMouseOver
- onKeyDown
- onLoad
Objekt
const objekt = {
egenskap: värde,
metod: function() {
return this.egenskap;
}
};
Konstruktorfunktioner
function Konstruktor(param1, param2) {
this.egenskap1 = param1;
this.egenskap2 = param2;
}
JS 1 (del 3)
JS (del 3) - Kalkylatorimplementering
Grundläggande HTML-struktur
- Form-element innehåller kalkylator
- Tabellayout för knappgrid
- Inmatningsfält för display och knappar
JavaScript-funktioner
// Rensa display
function resetDisplay() {
document.calc.display.value = '';
}
// Uppdatera display med knappvärde
function updateDisplay(inValue) {
document.calc.display.value = document.calc.display.value + inValue;
}
// Beräkna resultat
function calculate() {
document.calc.display.value = eval(document.calc.display.value);
}
Händelsehanterare
- onload: resetDisplay()
- onClick: updateDisplay(value)
- Likamed-knapp: calculate()
CSS-styling
.calc-cell {
text-align: center;
vertical-align: middle;
padding: 3px;
}
.calc-button {
width: 30px;
height: 30px;
background-color: #999;
border: 1px solid black;
}
.display {
width: 140px;
height: 35px;
background-color: #eee;
}
Säkerhetsanmärkning
- Undvik att använda eval() i produktionskod
- eval() kan exekvera skadlig kod
- Använd säkrare beräkningsmetoder istället
JS 2 (del 1) - Formulärvalidering
JS 2 (del 1) - Formulärvalidering
Grunderna i formulärvalidering
- Klient-sidig validering med JavaScript
- Server-sidig validering krävs fortfarande
- Förhindrar onödiga serverförfrågningar
- Förbättrar användarupplevelsen
Vanliga valideringstyper
- Obligatoriska fält
- Formatvalidering (e-post, datum)
- Längdbegränsningar
- Mönstermatchning
- Filtypsvalidering
Grundläggande exempel på formulärvalidering
function validateForm() {
let form = document.forms["myForm"];
if (form["name"].value === "") {
alert("Namn måste fyllas i");
return false;
}
return true;
}
Filuppladdningsvalidering
function validateFile() {
let fileInput = document.getElementById("fileUpload");
let filePath = fileInput.value;
let allowedExtensions = /(\.jpg|\.jpeg|\.png|\.gif)$/i;
if (!allowedExtensions.exec(filePath)) {
alert("Ogiltig filtyp");
fileInput.value = '';
return false;
}
return true;
}
Formulärhändelser
- onsubmit
- onchange
- onblur
- onfocus
- oninput
Säkerhetsöverväganden
- Förlita dig aldrig enbart på klient-sidig validering
- Rensa data server-side
- Skydda mot XSS-attacker
- Validera filtyper noggrant
JS 2 (del 2) - Formulärstyling & Layout
JS 2 (del 2) - Formulärstyling & Layout
Tabellstruktur
- Matcha presentationslayout med formulärfält
- Vänster kolumn: Etiketter
- Höger kolumn: Inmatningsfält
- Bakgrundsfält under tabellen
- Åtgärdsknappar längst ner
Grundläggande CSS för formulärelement
input[type=text], input[type=file], input[type=date], select, textarea {
padding: 5px;
box-sizing: border-box;
border: 1px solid black;
background-color: #d7ecff;
font-size: 16px;
}
input[type=file] {
color: transparent;
width: 166px;
}
select option {
margin: 40px;
color: #335566;
background-color: rgba(0,0,0,0.4);
}
Layouttips
- Använd container-div:ar för avstånd
- Behåll konsekventa tabellcellbredder
- Behåll unika ID:n för formulärelement
- Prefixa formulärelement-ID:n med ‘f_’
- Placera knappar inuti formuläret men utanför tabellen
Viktiga anmärkningar
- Matcha befintlig webbplatsstyling
- Behåll formulärvalidering intakt
- Behåll korrekt element-nestning
- Följ containerhierarkin
- Använd korrekt CSS-arv
JS 3
JS 3 - Inloggningsautentisering & Säkerhet
Inloggningsformulärstruktur
- Inmatningsfält för anställdskod
- Inmatningsfält för lösenord
- Skicka- och återställningsknappar
- Centrerad på sidan
- Grundläggande styling som matchar befintliga formulär
HTML-implementering
<form name="login" action="login.html" method="post" onsubmit="return formCheck()">
<h1>Login</h1>
<input type="text" name="employeeCode" maxlength="20">
<br>
<input type="password" name="password">
<br>
<input type="submit" value="Login">
<input type="reset">
</form>
Formulärvalidering
function formCheck() {
if (document.login.employeeCode.value === "" ||
document.login.employeeCode.value.indexOf("-") === -1) {
alert("Du måste ange en giltig anställdskod");
return false;
}
if (document.login.password.value === "") {
alert("Du måste ange ett lösenord");
return false;
}
return true;
}
Säkerhetsöverväganden
- Lösenordshashning krävs
- HTTPS för dataöverföring
- Kryptering av frågesträng
- Skydd mot man-in-the-middle-attacker
- Server-sidig validering är avgörande
Frågesträngsformat
- employee_code=värde&password=krypterat_värde
- POST-metoden rekommenderas framför GET
- Data behöver fortfarande krypteras även med POST
JS 4 (del 1)
JS 4 (del 1) - Krypteringsalgoritm
Grunderna i Tricel-krypteringsalgoritmen
- Baserad på Caesar-chifferhjulrotation
- Slumpmässiga rotationssteg
- Saltvärden läggs till före och efter meddelandet
- Numerisk nyckelrepresentation
- Teckenuppsättning begränsad till versaler och mellanslag
Implementeringssteg
- Skapa alfabetarray
- Generera slumpmässig rotationsnyckel
- Generera slumpmässiga saltvärden
- Kryptera meddelande med rotation
- Lägg till saltvärden
- Lägg till nycklar i början av meddelandet
Initiala variabler
var alphabet = ["A","B","C","D","E","F","G","H","H","I","J","K","L","M",
"N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," "];
var alphabetLength = alphabet.length;
Grundläggande formulärstruktur
<form name="password" action="login.html" method="get">
<input type="text" name="password">
<input type="button" value="Encrypt" onclick="encrypt()">
<input type="reset">
</form>
Valideringsfunktion
function checkLegalLetters(password) {
let passwordOK = true;
let passwordArray = password.split("");
for (let i = 0; i < passwordArray.length; i++) {
if (!alphabet.includes(passwordArray[i])) {
passwordOK = false;
}
}
return passwordOK;
}
Säkerhetsanmärkningar
- Begränsad teckenuppsättning ökar förutsägbarheten
- Saltvärden ökar komplexiteten
- Rotationsnyckeln måste överföras säkert
- Inte lämplig för känslig data
- Endast i utbildningssyfte
JS 4 (del 2)
JS 4 (del 2) - Krypteringsimplementering
Generering av lösenordsnyckel
// Generera slumpmässig nyckel
let passwordKey = Math.floor(Math.random() * alphabet.length);
// Hämta bokstav för slumpmässig nyckel
let keyLetter = alphabet[passwordKey];
// Visa nyckel i formuläret
document.password.form.password_key.value = keyLetter;
Skapande av roterat alfabet
// Skapa roterad alfabetarray
let rotatedAlphabet = [];
// Loopa genom alfabetet och skifta med nyckel
for (let i = 0; i < alphabet.length; i++) {
let newLetter = i + passwordKey;
// Om newLetter går bortom alfabetet, börja från början
if (newLetter >= alphabet.length) {
newLetter = newLetter - alphabet.length;
}
rotatedAlphabet[i] = alphabet[newLetter];
}
Krypteringsprocess
// Dela upp lösenordet i en array
let passwordOld = document.password.form.password.value.split("");
let passwordNew = [];
// Kryptera varje bokstav
for (let i = 0; i < passwordOld.length; i++) {
let passwordIndex = alphabet.indexOf(passwordOld[i]);
passwordNew[i] = rotatedAlphabet[passwordIndex];
}
// Sammanfoga krypterat lösenord
let passwordBody = passwordNew.join("");
// Generera saltvärden
let salt = Math.floor(Math.random() * alphabet.length);
let saltLetter = alphabet[salt];
let salt1 = "";
let salt2 = "";
// Lägg till slumpmässiga salttecken
for (let i = 0; i < salt; i++) {
salt1 += alphabet[Math.floor(Math.random() * alphabet.length)];
salt2 += alphabet[Math.floor(Math.random() * alphabet.length)];
}
// Kombinera alla krypterade delar
let passwordEncrypted = saltLetter + salt1 + keyLetter + passwordBody + salt2;
document.password.form.password_encrypted.value = passwordEncrypted;
Säkerhetsanmärkningar
- Grundläggande kryptering för utbildningsändamål
- Inte lämplig för produktionsanvändning
- Saltvärden ökar komplexiteten
- Slumpmässig nyckelgenerering varje gång
- Rotation baserad på alfabetposition
JS 5
JS 5 - Dekrypteringsalgoritm
Bearbetning av frågesträng
let query = window.location.search.substring(1);
let vars = query.split('&');
for (let i = 0; i < vars.length; i++) {
let pairs = vars[i].split('=');
if (pairs[0] === 'password') {
document.getElementById('password').value = pairs[1];
}
}
Dekrypteringssteg
- Extrahera krypterad text från frågesträngen
- Avkoda URL-kodade tecken
- Extrahera saltvärden och rotationssteg
- Omvänd rotation baserad på algoritm
- Ta bort saltvärden
- Konvertera tillbaka till vanlig text
Säkerhetsöverväganden
- Hantera dekrypteringsfel på ett smidigt sätt
- Validera inmatningsformat
- Kontrollera om data är felaktig
- Logga dekrypteringsförsök
- Skydda mot brute force-attacker
Formulärstruktur
- Inmatningsruta för krypterad text
- Visningsområde för dekrypterat resultat
- Steg-för-steg-visning av dekrypteringsprocessen
- Felmeddelandeområde
Implementeringsanmärkningar
- Matcha krypteringsalgoritmen exakt
- Använd samma teckenuppsättning som krypteringen
- Upprätthåll alla säkerhetsåtgärder
- Dokumentera dekrypteringsprocessen
JS 6
Inlämningsuppgift 2
JS 7
JS 7 - Hashning & Säkerhet
Skillnader mellan kryptering och hashning
-
Kryptering:
- Reversibel process
- Data kan dekrypteras tillbaka till originalet
- Använder nycklar för kryptering/dekryptering
- Bra för meddelandeöverföring
-
Hashning:
- Envägsprocess
- Kan inte återställa originaldata
- Samma inmatning ger alltid samma hash
- Bra för lösenordslagring
Säkerhetsöverväganden
- Lagra aldrig lösenord i klartext
- Frontend-kryptering är synlig i källkoden
- Hashning är säkrare för frontend-användning
- Hasha alltid lösenord innan lagring
MD5-hashning
- Skapad 1991 av Ronald Rivest
- 128-bitars hashvärde (32 tecken)
- Betraktas som trasig sedan 2008
- Inte lämplig för modern säkerhet
- Fortfarande användbar för filintegritetskontroller
Vanliga MD5-verktyg
- MD5-hashgeneratorer
- Regnbågsbord
- Hash-knäckare
- Brute Force-verktyg
SHA-256
- Säkrare än MD5
- 256-bitars hashvärde (64 tecken)
- Rekommenderas för närvarande för säkerhet
- Krävs för moderna applikationer
Implementeringsexempel
function hashPassword() {
let password = document.loginForm.password.value;
document.loginForm.password.value = hexMD5(password);
return true;
}
Bästa säkerhetspraxis
- Använd moderna hashalgoritmer (SHA-256+)
- Lagra aldrig lösenord i klartext
- Hasha alltid på serversidan
- Implementera saltvärden
- Regelbundna säkerhetsrevisioner
JS 8 (del 1)
JS 8 (del 1) - AJAX
Vad är AJAX?
- Asynchronous JavaScript And XML
- Upprätthåller klient-server-kommunikation
- Uppdaterar sidinnehåll utan uppdatering
- Baserad på XMLHttpRequest-objektet
- Kan uppdatera DOM-objekt baserat på händelser
Hur AJAX fungerar
- Händelse inträffar (onClick, onChange, onLoad)
- XMLHttpRequest-objekt skapas
- Begäran skickas till webbservern
- Servern bearbetar begäran
- Servern skickar tillbaka svar
- JavaScript läser svaret
- Sidinnehållet uppdateras
Grundläggande AJAX-struktur
// Skapa XMLHttpRequest-objekt
const xhttp = new XMLHttpRequest();
// Definiera onload-funktion
xhttp.onload = function() {
document.getElementById("demo").innerHTML = this.responseText;
}
// Öppna och skicka begäran
xhttp.open("GET", "ajax_info.txt", true);
xhttp.send();
XMLHttpRequest-egenskaper
- onload
- responseText
- responseXML
- status
- statusText
XMLHttpRequest-metoder
- open()
- send()
- abort()
- getAllResponseHeaders()
- getResponseHeader()
CORS-säkerhet
- Cross-Origin Resource Sharing
- Begränsar webbläsaren från att läsa lokala filer
- Säkerhetsåtgärd mot skadliga skript
- Kräver korrekt serverkonfiguration
- Lokal utveckling kräver lösningar
Utvecklingslösningar
- Använd lokal webbserver
- Chrome-tillägg för CORS
- Inaktivera webbsäkerhet (endast utveckling)
- Server-sidiga CORS-headers
- Åsidosätt aldrig i produktion
JS 8 (del 2)
JS 8 (del 2) - JQuery
Grundläggande JQuery-struktur
- Dokumentets redo-funktion
- Händelsehantering
- AJAX-anrop
- DOM-manipulation
Vanliga JQuery-metoder
$(document).ready(function() {
$("#button").click(function() {
$("#div").load("ajax_info.txt", function(response, status, xhr) {
if (status === "success") {
alert("Innehållet laddades framgångsrikt");
} else {
alert("Fel: " + xhr.status + ": " + xhr.statusText);
}
});
});
});
Exempel på databasladdning
function loadDoc() {
const xhttp = new XMLHttpRequest();
xhttp.onload = function() {
document.getElementById("infoLastLogin").innerHTML = this.responseText;
}
xhttp.open("GET", "login_db.txt", true);
xhttp.send();
}
Datum- och tidsfunktioner
function loadDateTime() {
let today = new Date();
let date = today.getDate() + "." + (today.getMonth() + 1) + "." + today.getFullYear();
let time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
let weekDayNumber = today.getDay();
let weekDayName;
switch(weekDayNumber) {
case 0: weekDayName = "Sunday"; break;
case 1: weekDayName = "Monday"; break;
case 2: weekDayName = "Tuesday"; break;
case 3: weekDayName = "Wednesday"; break;
case 4: weekDayName = "Thursday"; break;
case 5: weekDayName = "Friday"; break;
case 6: weekDayName = "Saturday"; break;
}
let htmlText = weekDayName + " " + date + " " + time;
document.getElementById("infoDateTime").innerHTML = htmlText;
setInterval(loadDateTime, 1000);
}
Bearbetning av inloggningsdata
function getQueryString(name) {
let vars = window.location.search.substring(1).split("&");
for (let i = 0; i < vars.length; i++) {
let temp = vars[i].split("=");
if (temp[0] === name) {
return temp[1];
}
}
return false;
}
function updateContainer() {
let employeeCode = getQueryString("employee_code");
let htmlText = "Välkommen tillbaka " + employeeCode;
document.getElementById("info").innerHTML = htmlText;
}
Databassträngbearbetning
let loginDBstring = loginDBstring.replace(/[\n\r\t]/g, "");
let loginDBarray = loginDBstring.split(",");
if (loginDBarray.includes(employeeCode)) {
let employeeIndex = loginDBarray.indexOf(employeeCode);
let numberOfLogins = loginDBarray[employeeIndex + 1];
let lastLoginDate = loginDBarray[employeeIndex + 2];
let lastLoginTime = loginDBarray[employeeIndex + 3];
}
JS 9 (del 1)
JS 9 (del 1) - XML & AJAX
XML-strukturregler
- Ett och endast ett rotelement
- Alla element måste stängas
- Element måste vara korrekt kapslade
- Elementnamn är skiftlägeskänsliga
- Attribut måste vara citerade
DOM-trädstruktur
- Document object model
- Trädliknande datastruktur
- Element som noder
- Förälder-barn-relationer
- Syskonrelationer
XML-parsning med JavaScript
// Skapa parser
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(text, "text/xml");
// Åtkomst till element
const elements = xmlDoc.getElementsByTagName("element");
const value = elements[0].childNodes[0].nodeValue;
XML AJAX-exempel
function loadXMLDoc() {
const xhttp = new XMLHttpRequest();
xhttp.onload = function() {
let xmlDoc = this.responseXML;
let elements = xmlDoc.getElementsByTagName("book");
let html = "";
for (let i = 0; i < elements.length; i++) {
html += elements[i].childNodes[0].nodeValue + "<br>";
}
document.getElementById("demo").innerHTML = html;
}
xhttp.open("GET", "books.xml", true);
xhttp.send();
}
Säkerhetsöverväganden
- Begränsningar för lokal filåtkomst
- CORS-policyer
- Serverkonfiguration krävs
- Datavalidering behövs
- Säker överföring
JS 9 (del 2)
JS 9 (del 2) - JSON
Vad är JSON
- JavaScript Object Notation
- Modernt datalagringsformat
- Ersätter XML i många applikationer
- Baserad på nyckel-värde-par
- Stöder kapslade strukturer
JSON-struktur
- Liknar JavaScript-objekt
- Använder krullparenteser
{}
- Nyckel-värde-par separerade med kolon
- Objekt separerade med kommatecken
- Kan kapslas flera nivåer
Exempel på JSON-struktur
{
"personnelRegistry": {
"employees": [
{
"employee_code": "001",
"name": "Hulk",
"signature_date": "2023-01-01"
}
]
}
}
JSON-metoder
// Parsa JSON-sträng till objekt
const jsonArray = JSON.parse(textString);
// Konvertera JSON-objekt till sträng
const textString = JSON.stringify(jsonObject);
Fördelar jämfört med XML
- Enklare syntax
- Inbyggt JavaScript-stöd
- Direkt åtkomst till egenskaper
- Mindre verbose
- Bättre prestanda
Enkelt JSON-exempel
// Skapa JSON-sträng
let text = '{"cars":["Ford","Audi","Fiat"]}';
// Parsa till JSON-objekt
let myArr = JSON.parse(text);
// Åtkomst till data
document.getElementById("demo").innerHTML = myArr.cars[0];
Säkerhetsanmärkningar
- Validera JSON innan parsning
- Använd try-catch med JSON.parse
- Rensa data innan användning
- Undvik eval() med JSON
- Kontrollera datatyper