Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript] Problem z walidacją formularza
Forum PHP.pl > Forum > Przedszkole
ermar
Witam.
W JS jestem zielony jak szczypior na wiosnę i potrzebuję pomocy.

Mam dwa inputy określające szerokość i wysokość pola.
Warunkiem jest , że jeden z wymiarów nie może przekroczyć 150 cm

Wymyśliłem taki kod
  1. <script type="text/javascript">
  2. var szerokosc = new LiveValidation('szerokosc', { validMessage: " " });
  3. var wysokosc = new LiveValidation('wysokosc', { validMessage: " " });
  4.  
  5. if (wysokosc > 150)
  6. {
  7. szerokosc.add( Validate.Numericality, { minimum: 1, maximum: 150, notANumberMessage: "Podaj tylko cyfry w centymetrach!", tooLowMessage: "Minimalna szerokość to 1 cm!", tooHighMessage: "Jeden z wymiarów nie może przekraczać 150cm!"} );
  8. }else
  9. {
  10. szerokosc.add( Validate.Numericality, { minimum: 1, notANumberMessage: "Podaj tylko cyfry w centymetrach!", tooLowMessage: "Minimalna szerokość to 1 cm!"} );
  11. }
  12.  
  13. if (szerokosc > 150)
  14. {
  15. wysokosc.add( Validate.Numericality, { minimum: 1, maximum: 150, notANumberMessage: "Podaj tylko cyfry w centymetrach!", tooLowMessage: "Minimalna wysokość to 1 cm!", tooHighMessage: "Jeden z wymiarów nie może przekraczać 150cm!"} );
  16. }
  17. else
  18. {
  19. wysokosc.add( Validate.Numericality, { minimum: 1, notANumberMessage: "Podaj tylko cyfry w centymetrach!", tooLowMessage: "Minimalna wysokość to 1 cm!" } );
  20. }
  21.  
  22.  


Ale pętla nie bardzo działa. Działa walidacja, pilnuje czy wartości nie są za małe i czy sa liczbami ale to wszystko.

Proszę uprzejmie o pomoc zielonemu.

Pozdrawiam
ermar
croc
Jaka pętla?

Sprawdź co zwraca konsola błędów.
ermar
Nie działa warunek z if jeżeli szerokość jest >150 tylko wykonuje się to co w else. To samo tyczy się drugiego if.
W Konsoli nie ma błędów dotyczących js, w firebug też error jest czysty.

Z pewnością źle coś robię ze zmiennymi ale nie wiem czego szukać ;/
skowron-line
1.
[JAVASCRIPT] pobierz, plaintext
  1. alert(wysokosc);
  2. alert(szerokosc);
[JAVASCRIPT] pobierz, plaintext

sprawdz co jest w tych zmiennych
2.
[JAVASCRIPT] pobierz, plaintext
  1. alert(typeof wysokosc);
  2. alert(typeof szerokosc);
[JAVASCRIPT] pobierz, plaintext

3.
[JAVASCRIPT] pobierz, plaintext
  1. parseInt(wysokosc) > 150 // albo parseFloat(wysokosc)
  2. parseInt(szerokosc) > 150 // albo parseFloat(szerokosc)
[JAVASCRIPT] pobierz, plaintext

ermar
alert (zmienna) - wyskakuje okienko a w nim [object Object]

alert (typeof zmienna) - wyskakuje okienko a w nim object

A ostatnie parseInt(wysokosc) > 150 - nie działa skrypt.
tzn działa ale tak jak działał. Nie bierze warunku z if pod uwagę - działa tylko else
skowron-line
A co ta klasa zwraca questionmark.gif Jaki obiekt questionmark.gif Dowiedz się tego a rozwiążesz problem.
piotr.kazmierczak
Dlatego do debugowania stosować lepiej console.log(). Zmienić te alerty i zobacz co wyskoczy. Wynik console.log możesz zobaczyć w konsoli:
- Chrome wciśnij CTRL+SHIFT+i
- Firefox dograj firebuga
- IE zmień przeglądarkę na inną
croc
Zmienne wysokosc i szerokosc przechowują obiekty. Nie możesz bezpośrednio porównać obiektów do liczb. Dowiedz się co zawierają te obiekty. Prawdopodobnie będzie trzeba porównać pole tych obiektów do liczb.
ermar
Ok - z manula wiem już że zwraca
Returns:

true if valid or throws a Validate.Error object containing the failure message

Tylko teraz pytanie - bo nie bardzo kumam - jak mam sprawdzić czy jest true skoro mam jakby to sprawdzenie wewnątrz if.

Wiem, że to banalne pytania ale js to dla mnie czarna magia
croc
Nieważne co zwraca. Ważne, jakie pola zawiera.
ermar
Z całym szacunkiem ale zaczęło się pisanie dla sztuki.
Ja wiem, że nie wiem. Nie znam js i nie kryje się z tym.
Nie wiem jak się dobierać do obiektów w js.


Walidacja przy pomocy LiveValidation jest super dla takiego lamera jak jak. Odpalam i działam bez większych problemów jeżeli chodzi o normalny formularz.

W php jest prosto - przesyłam sobie dane do skryptu i wszystko widzę.


Pytam w przedszkolu bo to chyba miejsce dla takich jak ja. Przecież ja nie znając podstaw nie wiem nawet dokładnie o co odpytać google.

Ta walidacja to ułomek całej aplikacji phpowej na którą mam mało czasu i dlatego proszę o pomoc ludzi doświadczonych w tej dziedzinie bo wykładam się na czymś prostym dla praktyka js.

Zdaje sobie sprawę, że daje się wędkę a nie rybę ale naprawdę mam nóż na gardle.

Wymyśliłem sobie takie coś bo myślałem, że ruszy:L
  1. if (document.wysokosc.value>150)


ale to zupełnie nie działa.

Obiecuje, że chętnie się z js podszkolę jak skończę to co aktualnie dłubie bo jest niestety coraz bardziej potrzebne.

Jeżeli dążymy do tego aby opłacić poradę to proszę o info o cenie za usługę pomocy z js.

Pozdrawiam

croc
Skoro to gotowy skrypt, to chyba jest do tego jakaś instrukcja? smile.gif
ermar
Tak - jest.
Odnosi się jednak do standardowej walidacji pól.
Z tym nie mam problemu.

To opis
"
Numericality (static function) Top

Validates that the value is numeric and: is an integer, is a specific number, is more than a minimum number, less than a maximum number, is within a range of numbers, or a combination of these

NB - numbers expressed in scientific form (ie 2e3, being 2000) are handled correctly, as are negative numbers, and floats.
Arguments:

value - {mixed} - value to be checked
paramsObj (optional) - {Object} - object containing parameters to be used for the validation
Parameters for paramsObj:

notANumberMessage (optional) - {String} - message to be used when validation fails because value is not a number (DEFAULT: “Must be a number!”)
notAnIntegerMessage (optional) - {String} - message to be used when validation fails because value is not an integer (DEFAULT: “Must be an integer!”)
wrongNumberMessage (optional) - {String} - message to be used when validation fails when ‘is’ param is used (DEFAULT: “Must be {is}!”)
tooLowMessage (optional) - {String} - message to be used when validation fails when ‘minimum’} param is used (DEFAULT: “Must not be less than {minimum}!”)
tooHighMessage (optional) - {String} - message to be used when validation fails when ‘maximum’} param is used (DEFAULT: “Must not be more than {maximum}!”)
is (optional) - {mixed} - the value must be equal to this numeric value
minimum (optional) - {mixed} - the minimum numeric allowed
maximum (optional) - {mixed} - the maximum numeric allowed
onlyInteger (optional) - {Boolean} - if true will only allow integers to be valid (DEFAULT: false)
Returns:

true if valid or throws a Validate.Error object containing the failure message
Example:

// check that value is an integer between -5 and 2000 exists in the string, case insensitive...
Validate.Numericality( 2e3, { minimum: -5, maximum: 2000 } );
"

Podziwiam, że warto się tak dowartościowywać kosztem niewiedzy innej osoby.
croc
Kto się niby dowartościowuje? Mimo Twojego niegrzecznego zachowania odpowiem Ci.

Dopiero teraz zauważyłem, że przypisujesz wartość LiveValidation do zmiennej, którą walidujesz. Napisałeś, że zwraca to prawdę/fałsz. Przypisz LiveValidation do innych zmiennych, np. szerokoscWalidacja/wysokoscWalidacja. Wtedy szerokosc i wysokosc pozostaną nietknięte.
ermar
To nie jest tak do końca, że moje zachowanie jest niegrzeczne.
Po prostu frustrujący jest brak rzeczowej odpowiedzi, poza lakoniczną wstawką o czytaniu manuala z emotikonem na końcu.
Trudno - odebrałem jako sarkazm - jeżeli uraziłem Cię - przepraszam.
Co do skryptu to naprawdę nie wiem jak dalej. Zastosowałem sie do Twojej rady i podmieniłem zmienne ale nie działa.
  1. <script type="text/javascript">
  2. var szerokoscWalidacja = new LiveValidation(\'szerokosc\', { validMessage: " " });
  3. var wysokoscWalidacja = new LiveValidation(\'wysokosc\', { validMessage: " " });
  4.  
  5.  
  6. if (document.test.wysokosc.value>150)
  7.  
  8. {
  9. szerokoscWalidacja.add( Validate.Numericality, { minimum: 1, maximum: 150, notANumberMessage: "Podaj tylko cyfry w centymetrach!", tooLowMessage: "Minimalna szerokość to 1 cm!", tooHighMessage: "Jeden z wymiarów nie może przekraczać 150cm!"} );
  10. }else
  11. {
  12. szerokoscWalidacja.add( Validate.Numericality, { minimum: 1, notANumberMessage: "Podaj tylko cyfry w centymetrach!", tooLowMessage: "Minimalna szerokość to 1 cm!"} );
  13.  
  14. }
  15. if (document.test.szerokosc.value>150)
  16.  
  17. {
  18. wysokoscWalidacja.add( Validate.Numericality, { minimum: 1, maximum: 150, notANumberMessage: "Podaj tylko cyfry w centymetrach!", tooLowMessage: "Minimalna wysokość to 1 cm!", tooHighMessage: "Jeden z wymiarów nie może przekraczać 150cm!"} );
  19. }
  20. else
  21. {
  22. wysokoscWalidacja.add( Validate.Numericality, { minimum: 1, notANumberMessage: "Podaj tylko cyfry w centymetrach!", tooLowMessage: "Minimalna wysokość to 1 cm!" } );
  23.  
  24. }
  25.  
  26.  
  27.  


Pewnie czegoś nie rozumiem. A jedyny error który dostaje w firebug to "document.test is undefined". Form ma nadany id="test".


Niktoś
Zamiast dokument.test spróbuj dać document.forms[0].Może to pomoże.
Dziwne ale document.test też powinien działąc-może masz jakąś literówkę -wielkość liter w nazwach też ma znaczenie.
croc
Masz kilka błędów. Spróbuj tak:

  1. <script type="text/javascript">
  2. var szerokosc = document.test.szerokosc.value;
  3. var wysokosc = document.test.wysokosc.value;
  4. var szerokoscWalidacja = new LiveValidation(szerokosc, { validMessage: " " });
  5. var wysokoscWalidacja = new LiveValidation(wysokosc, { validMessage: " " });
  6.  
  7.  
  8. if (wysokosc>150)
  9.  
  10. {
  11. szerokoscWalidacja.add( Validate.Numericality, { minimum: 1, maximum: 150, notANumberMessage: "Podaj tylko cyfry w centymetrach!", tooLowMessage: "Minimalna szerokość to 1 cm!", tooHighMessage: "Jeden z wymiarów nie może przekraczać 150cm!"} );
  12. }else
  13. {
  14. szerokoscWalidacja.add( Validate.Numericality, { minimum: 1, notANumberMessage: "Podaj tylko cyfry w centymetrach!", tooLowMessage: "Minimalna szerokość to 1 cm!"} );
  15.  
  16. }
  17. if (szerokosc>150)
  18.  
  19. {
  20. wysokoscWalidacja.add( Validate.Numericality, { minimum: 1, maximum: 150, notANumberMessage: "Podaj tylko cyfry w centymetrach!", tooLowMessage: "Minimalna wysokość to 1 cm!", tooHighMessage: "Jeden z wymiarów nie może przekraczać 150cm!"} );
  21. }
  22. else
  23. {
  24. wysokoscWalidacja.add( Validate.Numericality, { minimum: 1, notANumberMessage: "Podaj tylko cyfry w centymetrach!", tooLowMessage: "Minimalna wysokość to 1 cm!" } );
  25.  
  26. }
  27.  
  28.  
  29.  
ermar
Raczej nie mam błędu w nazwach. document.form[0] też nie działa.
Dam może jeszcze form do obejrzenia
  1. <form onchange="return true;" class="coords" method="post" action="index.php" id="test">
  2. ......
  3.  
  4. '<h4 style="font-size: 13px; color: #e84e02; margin: 0 0 10px 0; padding: 0;">Rozmiar</h4>
  5. <input type="text" id ="szerokosc" name="szerokosc" style="width: 40px; margin: 0 5px 0 0; padding: 0; border: solid 1px #ccc;"> x
  6. <input type="text" id ="wysokosc" name="wysokosc" style="width: 40px; margin: 0 5px 0 5px; padding: 0; border: solid 1px #ccc;"> <br><br>
  7. <span style="color: #e84e02;">UWAGA!</span> Jeden z wymiarów nie może przekraczać 150 cm. (max szerokość zadruku)<br><br>
  8.  
  9. <script type="text/javascript">
  10. var szerokoscWalidacja = new LiveValidation(\'szerokosc\', { validMessage: " " });
  11. var wysokoscWalidacja = new LiveValidation(\'wysokosc\', { validMessage: " " });
  12.  
  13.  
  14. if (document.forms[0].wysokosc.value>150)
  15.  
  16. {
  17. szerokoscWalidacja.add( Validate.Numericality, { minimum: 1, maximum: 150, notANumberMessage: "Podaj tylko cyfry w centymetrach!", tooLowMessage: "Minimalna szerokość to 1 cm!", tooHighMessage: "Jeden z wymiarów nie może przekraczać 150cm!"} );
  18. }else
  19. {
  20. szerokoscWalidacja.add( Validate.Numericality, { minimum: 1, notANumberMessage: "Podaj tylko cyfry w centymetrach!", tooLowMessage: "Minimalna szerokość to 1 cm!"} );
  21.  
  22. }
  23. if (document.forms[0].szerokosc.value>150)
  24.  
  25. {
  26. wysokoscWalidacja.add( Validate.Numericality, { minimum: 1, maximum: 150, notANumberMessage: "Podaj tylko cyfry w centymetrach!", tooLowMessage: "Minimalna wysokość to 1 cm!", tooHighMessage: "Jeden z wymiarów nie może przekraczać 150cm!"} );
  27. }
  28. else
  29. {
  30. wysokoscWalidacja.add( Validate.Numericality, { minimum: 1, notANumberMessage: "Podaj tylko cyfry w centymetrach!", tooLowMessage: "Minimalna wysokość to 1 cm!" } );
  31.  
  32. }
  33.  
  34.  
  35.  
  36.  
  37. </form>


croc - niestety nie działa - tzn nic się nie dzieje.
Nie dostaje komunikatu o błędzie. Nie ważne czy wpisuje tekst czy cyfry nic się nie dzieje.
W firebug tylko
document.test is undefined
[Wstrzymuj na tym błędzie] var szerokosc = document.test.szerokosc.value;

Po prostu skrypt leży i kwiczy.

Skończyły mi się pomysły. Czuję się jak bym naprawiał samochód smile.gif Jeżdżę bo umiem i znam obsługę auta ale pewnych rzeczy nie naprawię.

Wkleiłem wyżej forma - może coś to da . Mam już tam ustawione zdarzenie może to bruździ ? Nie wiem naprawdę.
Niktoś
Spróbuj dać cały blok <script type="text/javascript"></script>poza obszar formularza. Nie wiem czy prawidłowo ,zrobiłeś umieszczając cały js w tagu<form>.
ermar
Wyrzuciłem za form ale niestety żadnej zmiany.
Niktoś
Normalnie dziwne, a co ci teraz krzyczy firebug jak dałeś poza??
ermar
Cały czas to samo
document.test is undefined
[Wstrzymuj na tym błędzie] var szerokosc = document.test.szerokosc.value;
Niktoś
To może nie być przyczyną ale ja staram się unikać takich praktyk:
var szerokosc = document.test.szerokosc.value;
Czasami może prowadzić do ,konfliktów i można znacznie ulec pomyłką.Jak tak nie idzie to wysokości spróbuj pobrać tak
  1. var szerok=document.getElementById("szerokosc").value;
  2. var wysok=document.getElementById("wysokosc").value;
  3. if (wysok>150) {
  4. .......
  5. }
  6. if (szerok>150){
  7. ....................
  8. }
ermar
Niestety nadal nie działa - tzn nic się nie dzieje.
mogę wpisywać litery i większe wartości.
Niktoś
Debuguj linika po linice-a tam gdzie błąd to postaraj się poprawić,wartości najlepiej pobierać bezpośrednio z drzewa DOM instrukcją document.getElementById("id_pola")
croc
Czy ja dobrze widzę, że nie masz nadanego atrybutu name dla form? Zapis document.xxx oczekuje, że xxx to NAZWA formularza, a nie jego ID.
Niktoś
Tak tylko document.forms[0] też o dziwo Mu nie działało.
ermar
Faktycznie było ustawione tylko id a nie name ale nie sprawia to różnicy w działaniu (a właściwie niedziałaniu tej walidacji).

A może macie jakiś przykład jak uzyskać to co chcę np czystym js ?
Żeby mając dwa inputy można w nie wpisać tylko cyfry i żeby dodatkowo jeden z nich nie mógł przekroczyć wartości 150.

To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.