Dogodki v JavaScriptu omogočajo, da se program odzove na dejanja uporabnika ali na spremembe v dokumentu in okolju izvajanja. S pomočjo dogodkov lahko določimo, kaj naj se zgodi ob kliku, tipkanju, spremembi vrednosti obrazca, nalaganju strani, premikanju kazalca in v številnih drugih primerih.
Pomni: V sodobni kodi dogodke praviloma povezujemo z metodo addEventListener(), ker omogoča bolj pregledno ločitev med zgradbo dokumenta HTML in programsko logiko.
Osnovna pravila
- Dogodek je obvestilo, da se je v dokumentu ali okolju zgodilo nekaj pomembnega.
- Dogodek lahko sproži uporabnik, brskalnik ali sam dokument.
- Dogodek obdelamo s funkcijo, ki jo povežemo z elementom ali objektom.
- Objekt dogodka vsebuje podatke o sproženem dogodku.
- Privzeto dejanje dogodka lahko po potrebi preprečimo z metodo
preventDefault().
Primerjave
Osnovni način povezovanja dogodkov
Dogodek lahko povežemo neposredno v oznaki HTML, na primer z lastnostjo onclick, ali pa v JavaScriptu z metodo addEventListener(). Prvi način je primeren za zelo kratke zglede, drugi pa je v sodobni kodi praviloma preglednejši in prožnejši. Omogoča tudi, da istemu elementu priredimo več poslušalcev za isti dogodek.
<button id="gumb1" type="button">Klikni me</button>
<script>
{
const gumb = document.getElementById("gumb1");
gumb.addEventListener("click", function () {
window.alert("Gumb je bil kliknjen.");
});
}
</script>
Pozor: Neposredno zapisovanje daljše kode v lastnosti, kot je onclick, zmanjšuje preglednost dokumenta HTML. Pri preglednejši praksi je pogosto primernejša metoda addEventListener().
Dogodki miške
Dogodki miške opisujejo dejanja, povezana s klikanjem, pritiskom tipke miške, premikanjem kazalca in vrtenjem kolesca. Nekateri dogodki se sprožijo nad samim elementom, drugi pa tudi pri premiku prek njegovih otrok.
| Dogodek | Natančnejši opis |
|---|---|
click |
Sproži se ob aktivaciji elementa s kazalcem, pogosto pa tudi ob aktivaciji z drugo vhodno napravo, na primer s tipkovnico. |
dblclick |
Sproži se, ko uporabnik v kratkem času dvakrat klikne isti element. |
mousedown |
Sproži se, ko uporabnik pritisne gumb miške nad elementom. |
mouseup |
Sproži se, ko uporabnik spusti gumb miške nad elementom. |
mousemove |
Sproža se med premikanjem kazalca nad elementom. |
mouseenter |
Sproži se, ko kazalec prvič vstopi na element. Ne upošteva premikanja med otroki elementa. |
mouseleave |
Sproži se, ko kazalec zapusti element. Ne sproža se ob premikanju med otroki elementa. |
mouseover |
Sproži se, ko kazalec vstopi na element ali na njegovega otroka. |
mouseout |
Sproži se, ko kazalec zapusti element ali njegovega otroka. |
contextmenu |
Sproži se ob odpiranju kontekstnega menija, navadno ob desnem kliku. |
wheel |
Sproži se ob vrtenju kolesca miške ali podobnem dejanju vhodne naprave. |
<p id="primer1"></p>
<button id="gumbKlik" type="button">En klik</button>
<button id="gumbDvojniKlik" type="button">Dvojni klik</button>
<script>
{
const izpis = document.getElementById("primer1");
const gumbKlik = document.getElementById("gumbKlik");
const gumbDvojniKlik = document.getElementById("gumbDvojniKlik");
gumbKlik.addEventListener("click", function () {
izpis.textContent = "Izveden je bil en klik.";
});
gumbDvojniKlik.addEventListener("dblclick", function () {
izpis.textContent = "Izveden je bil dvojni klik.";
});
}
</script>
Dogodki kazalca
Dogodki kazalca omogočajo enoten model za miško, dotik in pisalo. Pri sodobnih uporabniških vmesnikih so pogosto primerna izbira, ker lahko z eno skupino dogodkov obravnavamo različne vrste vhodnih naprav.
| Dogodek | Natančnejši opis |
|---|---|
pointerdown |
Sproži se, ko kazalna naprava postane aktivna, na primer ob pritisku tipke miške ali začetku dotika. |
pointerup |
Sproži se, ko se aktivnost kazalne naprave zaključi. |
pointermove |
Sproža se med premikanjem kazalne naprave. |
pointerenter |
Sproži se, ko kazalec vstopi na območje elementa. |
pointerleave |
Sproži se, ko kazalec zapusti območje elementa. |
pointercancel |
Sproži se, ko brskalnik ali sistem prekine obdelavo trenutnega dejanja kazalca. |
<p id="primer2">Klikni ali se dotakni okvirja.</p>
<div id="poljeKazalca" style="width:220px; padding:12px; border:1px solid #999;">
Aktivno območje
</div>
<script>
{
const polje = document.getElementById("poljeKazalca");
const izpis = document.getElementById("primer2");
polje.addEventListener("pointerdown", function () {
izpis.textContent = "Dogodek pointerdown je bil sprožen.";
});
}
</script>
Klikni ali se dotakni okvirja.
Pomni: Kadar želimo enotno obravnavati miško, dotik in pisalo, so dogodki kazalca pogosto preglednejša izbira kot ločeno obravnavanje različnih tipov vhodnih naprav.
Dogodki tipkovnice
Dogodki tipkovnice se uporabljajo pri odzivu na pritisk in spust tipk. V sodobni kodi sta praviloma najpomembnejša dogodka keydown in keyup. Dogodek keypress je starejši in danes ni več osrednja priporočena izbira.
| Dogodek | Natančnejši opis |
|---|---|
keydown |
Sproži se, ko uporabnik pritisne tipko. Primeren je za večino sodobne obdelave tipkovnice. |
keyup |
Sproži se, ko uporabnik spusti tipko. |
keypress |
Starejši dogodek, ki se danes ne uporablja več kot osrednja priporočena izbira za novo kodo. |
<p id="primer3">Pritisni poljubno tipko.</p>
<input id="vnosTipka" type="text">
<script>
{
const vnos = document.getElementById("vnosTipka");
const izpis = document.getElementById("primer3");
vnos.addEventListener("keydown", function (dogodek) {
izpis.textContent = "Pritisnjena tipka: " + dogodek.key;
});
}
</script>
Pritisni poljubno tipko.
Pozor: Dogodek keypress je starejši in danes ni več najprimernejša splošna izbira. Pri sodobni kodi sta običajno primernejša keydown in keyup.
Dogodki obrazca
Dogodki obrazca so pomembni pri vnosu podatkov, preverjanju pravilnosti in pošiljanju obrazca. Posebej pomembna je razlika med dogodkoma input in change. Dogodek input se sproža sproti ob spreminjanju vrednosti, dogodek change pa ob potrjeni spremembi.
| Dogodek | Natančnejši opis |
|---|---|
input |
Sproža se sproti med spreminjanjem vrednosti vnosnega polja ali drugega ustreznega elementa. |
change |
Sproži se, ko uporabnik spremembo potrdi oziroma zaključi. |
focus |
Sproži se, ko element dobi fokus. |
blur |
Sproži se, ko element izgubi fokus. |
submit |
Sproži se ob pošiljanju obrazca. |
reset |
Sproži se ob ponastavitvi obrazca. |
invalid |
Sproži se pri elementu obrazca, ki ne ustreza omejitvam preverjanja veljavnosti. |
select |
Sproži se, ko uporabnik v besedilnem polju izbere del besedila. |
<p id="primer4"></p>
<input id="imeUporabnika" type="text" placeholder="Vnesi ime">
<script>
{
const polje = document.getElementById("imeUporabnika");
const izpis = document.getElementById("primer4");
polje.addEventListener("input", function () {
izpis.textContent = "Trenutni vnos: " + polje.value;
});
}
</script>
Dogodki strani
Dogodki strani opisujejo spremembe stanja dokumenta in okna. Za pripravo kode po zgraditvi dokumenta je pogosto posebej uporaben DOMContentLoaded, medtem ko load čaka tudi na nalaganje drugih virov strani. Dogodek visibilitychange se sproži, ko dokument postane viden ali skrit.
| Dogodek | Natančnejši opis |
|---|---|
DOMContentLoaded |
Sproži se, ko je drevo dokumenta HTML zgrajeno in pripravljeno za obdelavo. |
load |
Sproži se, ko je dokument oziroma vir v celoti naložen. |
pageshow |
Sproži se, ko stran postane aktivna v seji zgodovine. |
pagehide |
Sproži se, ko stran preneha biti aktivna v seji zgodovine. |
visibilitychange |
Sproži se, ko dokument postane viden ali skrit za uporabnika. |
resize |
Sproži se ob spremembi velikosti pogleda ali drugega ustreznega območja. |
scroll |
Sproži se ob pomikanju po dokumentu ali elementu. |
<p id="primer5">Stran se še pripravlja.</p>
<script>
document.addEventListener("DOMContentLoaded", function () {
document.getElementById("primer5").textContent = "Dokument HTML je pripravljen.";
});
</script>
Stran se še pripravlja.
Pomni: Za splošno pripravo kode po zgraditvi dokumenta je pogosto primeren DOMContentLoaded, medtem ko load čaka tudi na druge vire strani.
Pozor: Dogodka unload in pogosto tudi beforeunload nista več najboljša splošna izbira za sodobno logiko strani. Pri spremljanju skritosti ali menjave strani je pogosto primerneje razmisliti o dogodkih visibilitychange in pagehide.
Dogodki odložišča
Dogodki odložišča so pomembni pri delu z besedilom in drugimi podatki, ki jih uporabnik kopira, izreže ali prilepi.
| Dogodek | Natančnejši opis |
|---|---|
copy |
Sproži se, ko uporabnik kopira vsebino. |
cut |
Sproži se, ko uporabnik izreže vsebino. |
paste |
Sproži se, ko uporabnik prilepi vsebino iz odložišča. |
Dogodki zgodovine in stanja
Nekateri dogodki so povezani z naslovom strani, zgodovino brskalnika, shrambo ali povezljivostjo.
| Dogodek | Natančnejši opis |
|---|---|
hashchange |
Sproži se, ko se spremeni sidrni del naslova URL. |
popstate |
Sproži se ob prehodu med vnosi v seji zgodovine, na primer pri gumbih nazaj in naprej. |
storage |
Sproži se ob spremembi ustrezne spletne shrambe v drugem dokumentu istega izvora. |
online |
Sproži se, ko okolje zazna ponovno spletno povezljivost. |
offline |
Sproži se, ko okolje zazna izgubo spletne povezljivosti. |
message |
Sproži se, ko okno, kanal ali drug ustrezen vir prejme sporočilo. |
Preprečevanje privzetega dejanja
Privzeto dejanje dogodka lahko preprečimo z metodo preventDefault(). To uporabimo na primer pri obrazcih, kadar želimo pošiljanje najprej preveriti z JavaScriptom.
<form id="obrazec1">
<button type="submit">Pošlji</button>
</form>
<p id="primer6"></p>
<script>
{
const obrazec = document.getElementById("obrazec1");
const izpis = document.getElementById("primer6");
obrazec.addEventListener("submit", function (dogodek) {
dogodek.preventDefault();
izpis.textContent = "Pošiljanje obrazca je bilo v tem zgledu preprečeno.";
});
}
</script>
Priporočila
- Dogodke praviloma povezuj z metodo
addEventListener(). - Pri tipkovnici praviloma uporabljaj
keydowninkeyup. - Pri obrazcih jasno loči med dogodkoma
inputinchange. - Kadar želiš enoten odziv za miško, dotik in pisalo, razmisli o dogodkih kazalca.
- Pri obdelavi obrazcev in povezav po potrebi uporabi
preventDefault(). - Za stanje vidnosti strani pogosto razmisli o dogodku
visibilitychange.
Pogoste napake
- Daljša logika je zapisana neposredno v lastnostih, kot je
onclick, zaradi česar je dokument manj pregleden. - Dogodek
keypressje uporabljen kot osrednji dogodek tipkovnice, čeprav to ni več najprimernejša sodobna izbira. - Dogodka
inputinchangese obravnavata kot enakovredna, čeprav se sprožita v različnih trenutkih. - Pri delu z obrazci se pričakuje preprečitev privzetega dejanja, vendar metoda
preventDefault()ni uporabljena. - Dogodki miške so uporabljeni v primerih, kjer bi bil za več vrst vhodnih naprav primernejši dogodek kazalca.
- Pri zapuščanju strani se brez premisleka uporablja
unload, čeprav to ni vedno najprimernejša sodobna izbira.