Tema
/
Interneto svetainių kliento dalies kūrimas JS

js/url-state.js — paieška URL'e

Kodo stulpelyje — js/url-state.js. Jis įrašo paiešką į URL: #/gallery?q=moon. Taip nuoroda „įsimena", ką matei, „Atgal" pereina per tavo paieškas, o perkrovimas neišmeta filtrų.

Galerijos maršrutas skaito parametrus atėjus, o paieškos laukas juos rašo:

// atėjus į galeriją — atkuriam iš URL:
const { q } = getParams();
if (q) { setSearchQuery(q); searchInput.value = q; }

// rašant — įrašom į URL:
searchInput.addEventListener('input', debounce((e) => {
  setSearchQuery(e.target.value.trim());
  setParams({ q: e.target.value.trim() });
}));

Du sprendimai čia — abu spąstai, jei padarysi ne taip.

Spąstai 1 (replaceState, ne location.hash =). setParams naudoja history.replaceState, kuris pakeičia dabartinį istorijos įrašą, o ne prideda naują:

history.replaceState(null, '', `#${path}?${query}`);   // ✅ pakeičia vietoje
// location.hash = ...                                  // ❌ prideda įrašą KAS raidę

Jei rašytum location.hash = ..., kiekvienas paieškos klavišas pridėtų naują istorijos įrašą. Įvedus „moon" — 4 įrašai. Vartotojas paspaudžia „Atgal" tikėdamasis grįžti į pradžią, o vietoj to „ištrina" po vieną raidę. „Atgal" tampa bevertis. replaceState tai išsprendžia: paieška keičia URL, bet neteršia istorijos.

Spąstai 2 (URLSearchParams, ne rankinis skaidymas). Užklausą (q=moon&days=30) niekada neskaidyk pats per split('&') ir split('='). Reikšmėse būna &, =, tarpai, unikodas — tavo skaidymas anksčiau ar vėliau sulūš. URLSearchParams viską koduoja/dekoduoja teisingai:

new URLSearchParams('q=deep%20space&days=30').get('q');   // "deep space"

Patikrink.

1. Galerijoje ieškai „moon" → URL virsta #/gallery?q=moon. Nukopijuok, atidaryk naujame skirtuke → galerija jau nufiltruota.
2. Naršai galeriją → nuotraukos detalę → paspaudi „Atgal" → grįžti į galeriją. Veikia pats.
3. Gilios nuorodos: #/apod/<data> atidaryta iš naujo → detalus vaizdas užsikrauna pats.

Toliau. Tu ką tik parašei maršrutizatorių rankomis — ir būtent todėl suprasi, ką už tave daro tikras (React Router, Vue Router): hash/history valdymą, parametrus, gilias nuorodas, „Atgal". Tai — Part 2 pabaiga: turi pilną, tikrą vanilla programą. Part 3 (15 pamoka) nukreipsim į ją TypeScript kompiliatorių — ir jis atras tikras klaidas, kurių nė nepastebėjom (pvz. detail.js pic.hdurl ir pic.copyright, kurie ne visada egzistuoja).