Tema
/
Interneto svetainių kliento dalies kūrimas JS

js/forms.js — gyva validacija

Kodo stulpelyje — js/forms.js, o jame — attachLiveValidation, kuris įgyvendina progresiją. Perskaityk blur ir input klausytojus greta:

el.addEventListener('blur', () => {           // (2) palieki lauką → tikrini
  touched.add(el.name);
  validateField(el.name);
});

el.addEventListener('input', () => {          // (3) rašai → tikrini TIK jei jau „touched"
  if (touched.has(el.name)) validateField(el.name);
});

Visa gudrybė — aibė touched. Laukas tampa „touched" tik jį palikus (arba pateikus formą). O input klausytojas tikrina tik touched laukus. Taigi:

  • Kol nepalikai lauko — tyla (nekrapštom, kol rašai pirmą kartą).
  • Palikai su klaida → laukas „touched" → nuo dabar kiekvienas klavišo paspaudimas tikrina, ir klaida dingsta vos ją ištaisius.

validateAll() (grąžinama funkcija) kviečiama per submit: patikrina viską ir pažymi visus laukus „touched", kad toliau būtų gyvas grįžtamasis ryšys.

Nustatymai, kurie veikia. settings.js sujungia tai su būsena: fillForm užpildo iš getSettings(), o per submit saveSettings(...) išsaugo į localStorage IR applyTheme(...) iškart pakeičia temą. Nustatymai — ne dekoracija; jie keičia programą ir išlieka. (settings-store.js laiko DEFAULT_SETTINGS; theme.jsapplyTheme.)

Patikrink. Nustatymų formoje:

1. Palik „Display name" tuščią → klaida pasirodo (blur).
2. Pradedi rašyti → klaida dingsta iškart (touched → live).
3. Išsaugai → tema pasikeičia, o perkrovus reikšmės išlieka.

Spąstai (CSS — tikra klaida, kurią sugavom). Įvestis stilizavom taip:

input[type="text"] { ... }        /* ← tik type="text" */

input[type="text"] yra tikslaus atitikimo selektorius — jis nestilizuoja type="email", type="url", type="password". Pusė laukelių (el. paštas, URL, slaptažodis) atrodė kitaip. Sprendimas — stilizuoti pagal „viskas, išskyrus žymimuosius":

input:not([type="checkbox"]):not([type="radio"]) { ... }

Taip pagauni visus teksto tipus vienu kartu, o checkbox/radio (kurie turi savo išvaizdą) palieki ramybėje.