html, javascript, odbiór parametrów w niezmienionym stanie
URLSearchParams, z formularza FormData, a do przekazania/odbioru złożonych struktur pomiędzy podstronami trzymaj je w sessionStorage/localStorage po serializacji JSON.stringify(). encodeURIComponent()Number(), JSON.parse()). JSON.parse() – wtedy stan jest faktycznie „niezmieniony”.1.1 Query string (?id=12&status=ok)
1.2 Hash fragment (#step=3)
1.3 Ciało formularza (POST / GET)
1.4 Web-Storage (localStorage, sessionStorage)
1.5 Cookies / Service-Worker Cache / IndexedDB (rzadziej do krótkotrwałego routingu)
1.6 API inter-component (np. postMessage, BroadcastChannel) – SPA
| Mechanizm | Co dociera do odbiorcy | Zachowanie typów | Ograniczenia |
|---|---|---|---|
| URLSearchParams | String (UTF-8, percent-encoded) | Brak – zawsze string | długość < ~2 kB, widoczne w lokatorze |
| Hash | String | jw. | brak wysyłki na serwer, łatwe do nadpisania „w tył” |
| FormData (GET) | String | jw. | jw. + wpływ encType |
| FormData (POST multipart) | Binary/String | częściowy | serwer pośredniczy, brak dla client-side routingu |
| Web-Storage | String → dowolny po JSON.parse | Pełne po serializacji JSON | ~5-10 MB, podatne na XSS |
| Cookies | String | jw. | 4 kB/ciastko, wysyłane na serwer, wymogi RODO, Secure/HttpOnly |
| postMessage / BroadcastChannel | Structured Clone | Pełne – przeglądarka klonuje strukturę | tylko w obrębie originu / zakładki |
3.1 URL (proste flagi, identyfikatory)
// wysyłka
const q = `product=${encodeURIComponent(prodId)}&view=${mode}`;
location.href = `details.html?${q}`;
// odbiór
const p = new URLSearchParams(location.search);
const id = Number(p.get('product')); // konwersja
const view = p.get('view'); // string
3.2 Złożony obiekt (koszyk, konfigurator) – sessionStorage
// zapisz
sessionStorage.setItem('cart', JSON.stringify(cartObj));
// przejdź
location.href = 'checkout.html';
// odbiór
const raw = sessionStorage.getItem('cart');
const cart = raw ? JSON.parse(raw) : null;
3.3 Wielokrotne wartości / tablice w URL
// ?tag=js&tag=html lub ?tag[]=js&tag[]=html
[...p.getAll('tag')]; // ['js','html']
3.4 Hash router w SPA
addEventListener('hashchange', () => {
const state = Object.fromEntries(new URLSearchParams(location.hash.slice(1)));
});
encodeURIComponent, unika kolizji z &, ?, #.decodeURIComponent wywoływany implicite w URLSearchParams.escape() (przestarzała).function assertEqual(src, rx) {
console.assert(JSON.stringify(src) === JSON.stringify(rx), 'Dane zmienione!');
}
Uruchom na końcu procesu przekazywania.
Number(v) lub parseInt/parseFloatv === 'true'JSON.parse(p.get('cfg')) z wcześniej encodeURIComponent(JSON.stringify(cfg))URL / URLSearchParams (pełne wsparcie we wszystkich Evergreen browsers). history.pushState()/replaceState() + popstate – dynamiczna zmiana parametrów bez przeładowania. react-router, vue-router, Angular) – automatycznie typują parametry. IndexedDB i Storage Foundation API (większe, transakcyjne). zodios, serde-qs) by walidować i odtwarzać typy w TypeScript.localStorage (łatwy dostęp JS). Zamiast tego cookie + HttpOnly lub sesja serwerowa. localStorage atakujący może wstrzyknąć payload.getParam<T extends number|string|boolean>() + guardy. URLSearchParams) – polyfill lub własny parser. localStorage (cart_v2) by móc bezpiecznie migrować.same origin) – testuj kolizje. postMessage, SharedArrayBuffer) dla zaawansowanego współdzielenia stanu. localStorage. URL Pattern API (proposal) – deklaratywne mapowanie routingu do parametrów. query-string, qs, superjson (zachowuje daty, mapy, sety).Aby odebrać parametry „w niezmienionym stanie”:
URLSearchParams + konwersja typów. sessionStorage/localStorage z JSON.stringify/parse. encodeURIComponent) i walidację typów przy odbiorze.