• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

poprawa kodu js (testowanie formularza)

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
174 wizyt
pytanie zadane 28 lipca 2017 w JavaScript przez UltraSF Stary wyjadacz (11,740 p.)
const validateForm = (function() {
    let options = {};

    const showFieldValidation = function(input, inputIsValid) {
        if (!inputIsValid) {
            if (!input.parentNode.className || input.parentNode.className.indexOf(options.classError) === -1) {
                input.parentNode.className += ' ' + options.classError
            }
        } else {
            const regError = new RegExp('(\\s|^)'+options.classError+'(\\s|$)');
            input.parentNode.className = input.parentNode.className.replace(regError, '');
        }
    };

    const testInputText = function(input) {
        let inputIsValid = true;
        const pattern = input.getAttribute('pattern');

        if (pattern !== null) {
            const reg = new RegExp(pattern, 'gi');
            if (!reg.test(input.value)) {
                inputIsValid = false;
            }
        } else {
            if (input.value === '') {
                inputIsValid = false;
            }
        }

        if (inputIsValid) {
            showFieldValidation(input, true);
            return true;
        } else {
            showFieldValidation(input, false);
            return false;
        }
    };

    const testInputSelect = function(select) {
        if (select.options[select.selectedIndex].value === '' || select.options[select.selectedIndex].value === '-1') {
            showFieldValidation(select, false);
            return false;
        } else {
            showFieldValidation(select, true);
            return true;
        }
    };

    const testInputCheckbox = function(input) {
        const name = input.getAttribute('name');
        const group = input.form.querySelectorAll('input[name="'+name+'"]:checked');

        if (group.length) {
            showFieldValidation(input, true);
            return true;
        } else {
            showFieldValidation(input, false);
            return false;
        }
    };

    const prepareElements = function() {
        const elements = options.form.querySelectorAll('input[required], textarea[required], select[required]');

        [].forEach.call(elements, function(element) {
            element.removeAttribute('required');
            element.className += ' required';

            if (element.nodeName.toUpperCase() === 'INPUT') {
                const type = element.type.toUpperCase();

                if (type === 'TEXT') {
                    element.addEventListener('keyup', function() {testInputText(element)});
                    element.addEventListener('blur', function() {testInputText(element)});
                }
                if (type === 'CHECKBOX') {
                    element.addEventListener('click', function() {testInputCheckbox(element)});
                }
                if (type === 'RADIO') {
                    element.addEventListener('click', function() {testInputCheckbox(element)});
                }
            }
            if (element.nodeName.toUpperCase() === 'TEXTAREA') {
                element.addEventListener('keyup', function() {testInputText(element)});
                element.addEventListener('blur', function() {testInputText(element)});
            }
            if (element.nodeName.toUpperCase() === 'SELECT') {
                element.addEventListener('change', function() {testInputSelect(element)});
            }
        });
    };

    const formSubmit = function() {
        options.form.addEventListener('submit', function(e) {
            e.preventDefault();

            let validated = true;
            const elements = options.form.querySelectorAll('.required');

            [].forEach.call(elements, function(element) {
                if (element.nodeName.toUpperCase() === 'INPUT') {
                    const type = element.type.toUpperCase();
                    if (type === 'TEXT') {
                        if (!testInputText(element)) validated = false;
                    }
                    if (type === 'CHECKBOX') {
                        if (!testInputCheckbox(element)) validated = false;
                    }
                    if (type === 'RADIO') {
                        if (!testInputCheckbox(element)) validated = false;
                    }
                }


                if (element.nodeName.toUpperCase() === 'TEXTAREA') {
                    if (!testInputText(element)) validated = false;
                }
                if (element.nodeName.toUpperCase() === 'SELECT') {
                    if (!testInputSelect(element)) validated = false;
                }
            });

            if (validated) {
                this.submit();
            } else {
                return false;
            }
        });
    };

    const init = function(_options) {
        options = {
            form : _options.form || null,
            classError : _options.classError || 'error'
        };

        if (options.form === null || options.form === undefined || options.form.length === 0) {
            console.warn('validateForm: Źle przekazany formularz');
            return false;
        }
        prepareElements();
        formSubmit();
    };

    return {
        init : init
    }
})();

document.addEventListener("DOMContentLoaded", function() {
    const form = document.querySelector('.form');
    validateForm.init({form : form})
});

kod jest zapożyczony  w całości z tego kursu js

zmieniłem tylko var na const i let, i z == zrobiłem === coś tam usunąłem coś tam dodałem nie istotne.

Chodzi o to że jedna część tego kodu sprawdza w czasie rzeczywistym dokonania użytkownika. Jednak jest mały błąd który mnie irytuje. Gdy użytkownik porusza się tabem dodaje się klasa error zanim zdąży coś napisać, a jako że ja zajmuje się php i jeszcze nie zdążyłem się umoczyć bardziej w js. Nie mam pojęcia jak naprawić ten błąd. Gdyby ktoś miły wyjaśnił mi jak to naprawić i dlaczego, bardzo byłbym wdzięczny. Pozdrawiam :)

komentarz 28 lipca 2017 przez ScriptyChris Mędrzec (190,190 p.)

Przed nadaniem klasy sprawdzaj, czy na danym polu użytkownik przeprowadził jakąś akcję - dla przykładu w Angularze to się określa jako ng-touched (zerknij na animację jakieś ćwierć strony niżej). Podczas startu aplikacji zapewne określony jest jakiś stan początkowy pól formularza. Więc gdy odpalaja się eventy podczas zmiany tych pól, to sprawdzaj, czy aktualna wartość różni się od początkowej - w zasadzie na pierwszy trigger eventa przestawiaj flagę, a dla wygody zrób sobie obiekt, którego polami (kluczami) będą nazwy/typy pól, a wartościami będą true/false. W funkcji showFieldValidation możesz sprawdzić czy flaga dla danego pola formularza ma flagę true (user już coś w niej dłubał), czy false (pole forma nietknięte). Wtedy dopiero nadawaj klasę error.

P.S.

  if (options.form === null || options.form === undefined || options.form.length === 0) {

Tutaj wystarczy zapisać krótko:

  if (!options.form) {

, ponieważ nullundefined i zero są wartościami z "gatunku" falsy, czyli takich które ewaluują do wartości logicznej false. Jeśli nie musisz wyraźnie sprawdzać czy to null czy undefinedfalse, pusty string  itd. to wystarczy skrótowy zapis .

komentarz 29 lipca 2017 przez UltraSF Stary wyjadacz (11,740 p.)
Dziękuje za rady :D

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

+1 głos
1 odpowiedź 250 wizyt
pytanie zadane 18 grudnia 2016 w JavaScript przez Kamil Naja Nałogowiec (27,550 p.)
+1 głos
1 odpowiedź 142 wizyt
pytanie zadane 15 sierpnia 2016 w JavaScript przez Albert Fijałkowski Użytkownik (590 p.)
0 głosów
1 odpowiedź 617 wizyt
pytanie zadane 20 lipca 2016 w JavaScript przez redstar1 Bywalec (2,200 p.)

93,187 zapytań

142,203 odpowiedzi

322,022 komentarzy

62,513 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2345p. - dia-Chann
  2. 2306p. - Łukasz Piwowar
  3. 2295p. - Łukasz Eckert
  4. 2282p. - CC PL
  5. 2252p. - Tomasz Bielak
  6. 2219p. - Łukasz Siedlecki
  7. 2215p. - rucin93
  8. 2201p. - Michal Drewniak
  9. 2156p. - Marcin Putra
  10. 2152p. - Adrian Wieprzkowicz
  11. 2105p. - Mikbac
  12. 1941p. - Anonim 3619784
  13. 1733p. - rafalszastok
  14. 1480p. - Michał Telesz
  15. 1469p. - ssynowiec
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...