2.13 HTML-element
Vi har i tidigare exempel använt querySelector()
, för att komma åt enskilda element. Nu ska vi också se hur vi kan komma åt en grupp av element med querySelectorAll()
. Vi repeterar också en del som vi redan varit inne på i tidigare exempel, t.ex. hur vi kan komma åt det element som användaren klickat på och ändring av elementst stil och klass.
I detta exempel tas det även upp hur vi går runt i HTML-strukturen till omgivande element. Det tas också upp två metoder för att komma åt och förändra attribut. Exemplet är uppdelat i två delar:
- Skillnad mellan
querySelector()
ochquerySelectorAll()
. Referenser till det element användaren klickat på samt omgivande element. - Referens till attribut och klasser samt inaktivering/aktivering av en knapp.
35 min.
Sammanfattning
Med querySelector("selektor")
får vi det första elementet som erhålls med selektorn. Med querySelectorAll("selektor")
får vi en lista (array) med alla de element som erhålls med selektorn.
Med this
får vi en referens till det element som användaren interagerat med (t.ex. klickat på), för att komma in i funktionen.
Med element.parentElement
får vi elementets "förälder", dvs det element som omger det som vi utgår från. Ett steg uppåt i HTML-strukturen.
Med element.previousElementSilbling
och element.nextElementSibling
går vi till ett "syskon", dvs det element som ligger före eller efter i HTML-koden, men på samma nivå i strukturen. Finns det inget sådant element, erhålls null
som resultat.
De fördefinierade attributen i HTML kan man komma åt med element.attribut
. Men har vi egendefinierade attribut som innehåller ett bindestreck, t.ex. data-myAttribute
, kan vi inte referera till det på samma sätt, eftersom bindestrecket då tolkas som en minusoperator. Då får vi istället använda funktionerna getAttribute()
och setAttribute()
. Dessa funktioner fungerar naturligtvis även för de fördefinierade attributen.
Knappar (button
-element) och andra element i formulär kan inaktiveras eller aktiveras, genom att sätta egenskapen disabled
till true
eller false
. Detta har redan använts i tidigare exempel, men repeteras här.
Egna övningar
Här följer ett förslag på några egna övningar. Öppna filen test.html och test.js och utför följande:
- Funktionen
init
:- Lägg till en rad för att tilldela
nrBlocks
, med hjälp avquerySelectorAll()
, så att det blir en array med allap
-element inom elementet med id"nrBlocks"
. - Skriv en likadan rad för
nrBtns
, så att det blir en array med allabutton
-element inom elementet med id"nrBtns"
. - Gå igenom
nrBtns
i enfor
-loop och lägg på händelsehanterare på knapparna, så att funktionentest
anropas, då man klickar på dem.
- Lägg till en rad för att tilldela
- Funktionen
test
:- Lägg in en rad för att inaktivera den knapp användaren klickat på.
- Klicka på knapparna, för att se att de inaktiveras.
- Lägg knappens
value
-attribut i en lokal variabel kalladnr
. - Gå igenom alla
nrBlocks
i enfor
-loop. I loopen ska följande göras:- Inför en lokal variabel
blockNr
och tilldela den attributetdata-nr
i detnrBlocks
som indexeras av loopvariabeln. - Jämför
nr
ochblockNr
i enif
-sats. Om de är lika lägger du innr
som innehåll i blocket. Lägg också till klassen"marked"
med hjälp avclassList.add()
.
- Inför en lokal variabel
- Efter loopen ska du göra en utskrift ifall siffran ej fanns i något av blocken. Då behöver du en s.k. flagga, för att avgöra om en siffra hittades eller ej.
- Före loopen lägger du in en rad där du inför variabeln
found
och sätter den tillfalse
. - I
if
-satsen i loopen sätter dufound
tilltrue
. - Efter loopen skriver du en ny
if
-sats med villkoret(!found)
, dvs omfound
fortfarande ärfalse
. I så fall skriver du"Siffran fanns inte"
i elementet för resultat.
- Före loopen lägger du in en rad där du inför variabeln
- Nu ska du kontrollera om alla siffror är funna, dvs om alla "block" har klassen
"marked"
.- Inför en variabel kallad
markedElems
och tilldela den med hjälp avquerySelectorAll()
, så att det blir alla element med klassen"marked"
inom elementet med id"nrBlocks"
. - I en
if
-sats kontrollerar du ommarkedElems.length
är lika mednrBlocks.length
. I så fall skriver du"Alla är markerade"
i elementet för resultat.
- Inför en variabel kallad
- Lägg in en rad för att inaktivera den knapp användaren klickat på.