js/router.js — maršrutų lentelė ir hashchange
Kodo stulpelyje — js/router.js. Trys dalys: lentelė (routes Map), parseRoute (hash → maršruto objektas) ir handleRoute (paleidžia atitinkamą funkciją).
parseRoute suskaido kelią ir grąžina maršrutą su parametrais:
if (parts[0] === 'apod' && parts[1]) return { name: 'detail', date: parts[1] };
#/apod/2026-07-11 → { name: 'detail', date: '2026-07-11' }. Data — maršruto parametras, ir būtent ji leidžia gilias nuorodas.
navigate(path) tik nustato location.hash — o tai savaime iššaukia hashchange. Nekviečiam handleRoute tiesiogiai; leidžiam įvykiui viską sujungti. Todėl ir nuoroda, ir „Atgal" veda per tą patį kelią.
Atkreipk dėmesį į kelio pasikeitimo apsaugą:
if (path === lastPath) return; // ta pati vieta? nieko neperkraunam
lastPath = path;
Kam? Nes paieška rašo ?q=… į URL (kitas žingsnis), o tai irgi iššaukia hashchange. Bet kelias (/gallery) nesikeičia — tik užklausa. Be šios apsaugos kiekvienas paieškos klavišas iš naujo paleistų viso vaizdo perpiešimą ir „nušoktų" į viršų. Reaguojam tik į kelio pokyčius.
Maršrutai susiejami su vaizdais (kurie jau parašyti ankstesnėse pamokose):
onRoute('home', renderHome);
onRoute('gallery', () => { /* atkurk paiešką iš URL, tada */ renderGallery(); });
onRoute('detail', (route) => renderDetail(route)); // route.date → deep link
home.js (pradžios ekranas su statistika) ir detail.js (viena nuotrauka) — paskutiniai vaizdai, atsirandantys būtent čia, nes jų prasmė — būti maršrutais.
Patarimas.
renderDetail(route)gaunаroute.date. Jei nuotraukos dar nėra atmintyje (atėjai per gilią nuorodą),detail.jspats atsisiunčia ją (fetchPicture(date)), tada peraddPicture→notify()persipiešia. Deep link „veikia iš niekur" — nes vaizdas moka užsikrauti pats.