Čo sú Web API?

Web API sú API natívne podporované prehliadačmi, s ktorými sa väčšinou komunikuje prostredníctvom javascriptu. Ich implementácia je naprieč prehliadačmi štandardizovaná, podpora je ale pri každom z nich rôzna.

Okrem známych ako napríklad Console API (funkcionalita console.log) alebo History API (simulácia stlačenia tlačidla back v prehliadači) existuje ale množstvo iných. Skúsme si ukázať aspoň 6 najzaujímavejších:

Fullscreen API

API pre prepnutie elementu do režímu fullscreen. Užitočné napríklad pre webstránky bez responzívneho dizajnu, ktoré chcú dať používateľovi možnosť čítať článok bez rušivých elementov. Nanešťastie, pre iOS podpora len pre tablety. Pre osobitné štýlovanie elementu vo fullscreen móde poskytuje css pseudo triedu :fullscreen.

<html>
<head>
<script type="text/javascript">
const article = document.getElementById("article");
// zistime ci sa element nasiel a ci je mozne zapnut fullscreen
if (article && document.fullscreenEnabled) {
article.requestFullscreen();
}
</script>
<style>
.article:fullscreen {
background-color: "#fff";
overflow: scroll;
}
</style>
</head>
</html>

Web Storage API

API pre ukladanie dát vo formáte kľúč-hodnota využitím buď sessionStorage (platnosť dát vyprší zatvorením karty, prípadne prehliadača) alebo localStorage objektu (perzistentné dáta ukladané v prehliadači). Na rozdiel od cookies ide o prehľadnejší spôsob ukladania dát s možnosťou odchytiť zmeny nad localStorage.

<html>
<head>
<script type="text/javascript">
const setPageLocal = () => {
// implementacia zmeny jazykovej verzie
};
// ak sa zmeni jazykova verzia stranky, dame vediet ostatnym kartam aby zmenili jazykovu verziu
window.addEventListener("storage", ({ key, newValue }) => {
if (key === "lang") {
// custom funkcia
setPageLocal(newValue);
}
});
// pre kazdy prepinac jazyka vytvorime handler na zmenu jazyka
const langButtons = document.getElementsByClassName("langButton");
Array.from(langButtons).forEach(langButton => {
langButton.addEventListener("click", () => {
// zapiseme zmenu do localStorage, ostatne karty zmenu zaregistruju
localStorage.setItem("lang", langButton.id);
// aktivna karta zmenu nazaregistruje, spustime priamo
setPageLocal(langButton.id);
});
});
</script>
</head>
<body>
<button id="sk-SK" class="langButton">SK</button>
<button id="en-GB" class="langButton">EN</button>
</body>
</html>

Intersection Observer API

API pre sledovanie elementov v DOM za účelom získania informácie o tom, či sa objavili, prípadne stratili z viditeľnej oblasti obrazovky. Jednoduchým spôsobom tak vieme napríklad pridať animáciu elementu, na ktorý sa práve používateľ prescrolloval.

<html>
<head>
<script type="text/javascript">
// najdeme vsetky obrazky v DOM
const images = document.getElementsByTagName("img");
const observer = new IntersectionObserver(items =>
items.forEach(item => {
// vzdy ked sa sledovany element dostane do viditelnej oblasti, pridame mu css triedu
if (item.intersectionRatio > 0) {
item.target.classList.add("animate");
}
})
);
// budeme sledovat intersection vsetkych najdenych obrazkov
Array.from(images).forEach(image => observer.observe(image));
</script>
</head>
</html>

Resize Observer API

API podobné Intersection Observer API. Sledujeme ale element za účelom získavania informácie o tom, či a ako sa zmenila veľkosť elementu. Používa sa hlavne v prípadoch, kedy sa mení layout stránky nie na základe zmeny vonkajšieho kontajnera/viewportu, ale na základe zmeny veľkosti iného elementu.

<html>
<head>
<script type="text/javascript">
// najdeme vsetky elementy, ktore chceme sledovat
const containers = document.getElementsByClassName("container");
const observer = new ResizeObserver(items =>
items.forEach(item => {
// vzdy ked sa zmeni vselkost elementu, pridame alebo odoberiem css triedu
if (item.contentRect.width <= 500) {
item.target.classList.add("full-width");
} else {
item.target.classList.remove("full-width");
}
})
);
// budeme sledovat zmenu velkosti vsetkych elementov, ktore sa nasli
Array.from(containers).forEach(container => observer.observe(container));
</script>
</head>
</html>

Page Visibility API

API, ktorým zisťujeme zmenu prítomnosti používateľa na stránke. Zmena nastáva napríklad v prípade, že sa používateľ preklikne na iný tab alebo minimalizuje okno. Tímto spôsobom vieme napríklad pauznuť video na stránke.

<html>
<head>
<script type="text/javascript">
const video = document.getElementById("video");
document.addEventListener("visibilitychange", () => {
if (video && document.hidden) {
video.pause();
}
});
</script>
</head>
</html>

Vibration API

API, ktoré komunikuje s vibračným hardwarom mobilného zariadenia a vibráciou môže užívateľa upozorňovať napríklad na notifikáciu alebo chybu pri odoslaní formulára. Bohužiaľ bez podpory pre iOS zariadenia. V prípade desktopových zariadení sa zavolaním funkcie neudeje nič.

const validateForm = values => {
// custom implementacia validacie hodnot
};
// budeme pocuvat na pripadne odoslanie formulara
const formElement = document.getElementById("form");
formElement.addEventListener("submit", e => {
e.preventDefault();
// spracujeme si data pre ucel validacie
const data = new FormData(formElement);
const values = {};
for (const [key, value] of data.entries()) {
values[key] = value;
}
// zistime ci je nejaky field nevalidny
const invalidFields = validateForm(values);
if (invalidFields.length > 0 && window.navigator.vibrate) {
window.navigator.vibrate(500);
return false;
} else {
// ak validacia zbehla, posleme XML HTTP request alebo inym sposobom spracujeme data
}
});

Neprehliadnite výsledky našej programátorskej práce.