// classic functions have their own 'this' contextfunction(){};// arrow functions don't have their own 'this' context()=>{};// implicit returnconstmultiply=(a,b)=>a*b;
constname='Dave';constsentence1='My name is '+name+'.';constsentence2=`My name is ${name}.`;sentence1===sentence2;constarticle={title: 'Pokemons gone wild',text: 'Lorem ipsum'};constdom=` <article> <h2>${article.title}</h2> <p>${article.text}</p> </article>`;
constintervalId=setInterval(()=>{console.log('every 1 second');},1000);// Calls a function at specified intervalsconsttimeoutId=setTimeout(()=>{console.log('after 1 second');},1000);// Calls a function after a specified amount of timeclearInterval(intervalId);clearTimeout(timeoutId);
JavaScript good practice
ukládat věci z DOMu do proměnných, pokud s nimi budeme pracovat opakovaně
nevytvářet globální proměnné (pod scope window)
nepoužívat == (!=) ale === (!==),
inicializovat proměnné
nemodifikovat DOM opakovaně (v cyklu)
Knihovny pro JavaScript
import knihovny - na pořadí záleží, pokud knihovna je závislá na jiné
používat zminifikovanou verzi
populární knihovny nestahovat k sobě ale používat CDN hosting
// a company object with its information{"name": "Veritas Inc.","capital": 1542000,"employees": ["Bill","Steve","Elon"],"address": {"street": "Wall Street 42","city": "New York","state": "NY","country": "United States of America"}}
// array of books and their authors[{"title": "Fantastic Beasts","author": "J. K. Rowling","year": 2001},{"title": "Game of Thrones","author": "George R.R. Martin","year": 1996}]
jak je dostat ze sevrveru a jak je poslat na server? pomocí AJAX
konvenční webová stránka komunikuje se serverem synchronním způsobem, tj. uživatel vyplní formulář, pošle ho a je přesměrován na jinou stránku s novými informacemi ze serveru
s AJAXem: data se posílají v pozadí pomocí JavaScriptu a podle výsledku se stránka aktualizuje za běhu, žádné přesměrovávání - pak se jedná o tzv. Single Page (AJAX) Aplikace
usecase: Uživatel může pokračovat v práci zatímco program načítá data v pozadí
pomocí AJAX můžeme
aktualizovat obsah stránky - bez reloadu stránky
načítat data ze serveru - bez reloadu stránky
posílat data na server - bez reloadu stránky
to vše běží na pozadí - tj. můžeme vytvářet asynchronní webové aplikace
doporučeným datovým formátem pro přenos je právě JSON
browsery mají zabudovaný objekt XMLHttpRequest pro asynchronní komunikace s externími servery. Nebo lze použít knihovny třetích stran
příklad volání klasické:
// built-in object for HTTP Requests GETvarxhr=newXMLHttpRequest();varurl='https://jsonplaceholder.typicode.com/posts';xhr.open('GET',url);xhr.addEventListener('load',function(){// callbackvardata=JSON.parse(xhr.responseText);});xhr.addEventListener('error',function(e){// callbackconsole.error('XHR error',e);});xhr.send();
příklad volání v jQuery:
// callback style$.ajax({method: 'GET',// or POST, DELETE, OPTIONS ...url: 'https://jsonplaceholder.typicode.com/posts',success: (resp)=>{...},error: (error)=>{...},});// Promise style - recommended!$.ajax({...})// $.get({...}) OR $.post({...}) .done((resp)=>{...}).fail((resp)=>{...}).always((resp)=>{...}).then((resp)=>{...});
vyvarujte se callback hell
// callback hell example - avoid it using promises load('/abc',(abcResp)=>{load('/def',(defResp)=>{load('/ghi',(ghiResp)=>{load('/jkl',(jklResp)=>{load('/mno',(mnoResp)=>{load('/pqr',(pqrResp)=>{console.log(...);});});});});});});load('/abc').then((abcResp)=>{returnload('/def');}).then((defResp)=>{returnload('/ghi');}).then((ghiResp)=>{returnload('/jkl');}).then((jklResp)=>{returnload('/mno');}).then((mnoResp)=>{returnload('/pqr');}).then((pqrResp)=>{console.log(...);});
Promise
co je to Promise? - objekt reprezentující eventuální ukončení / selhání asynchronní operace včetně její výsledky. - cit. MDN
$.ajax({...})// vrací Promise - thenable$.get({...})// vrací Promise - thenable$.post({...})// vrací Promise - thenable
dostaneme objekt, na kterém lze volat metodu then(callback), jejíž callback se zavolá při ukončení asynchronní operace, podobně jako v případě eventListeneru
jQuery AJAX events - lze zachytávat události a spustit
$.ajaxStart(cb)// pokud odstartuje první Ajax request na stránce$.ajaxStop(cb)// pokud se doběhnou všechny Ajax requesty na stránce$.ajaxComplete(cb)// pokud doběhne jakýkoli Ajax request$.ajaxSuccess(cb)// pokud jakýkoliv Ajax request doběhne správně$.ajaxError(cb)// pokud jakýkoliv Ajax request skončí s chybou$.ajaxSend(cb)// se před odesláním jakékoliv Ajax requestu
paralelní volání HTTP požadavků v jQuery
$.when($.getJSON('/abc').done((resp)=>{doSomethingWith(resp);}),$.getJSON('/def').done((resp)=>{doSomethingWith(resp);}),$.getJSON('/ghi').done((resp)=>{doSomethingWith(resp);}),$.getJSON('/jkl').done((resp)=>{doSomethingWith(resp);})).then(()=>{console.log('All promises have resolved');});