Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript] Walidacja formularza
Forum PHP.pl > Forum > Przedszkole
in5ane
Cześć, jak to zrobić poprawnie walidacje w JS, aby sprawdzało, czy został wybrano chociaż jeden zawód z wielu podanych?
Próbowałem tak:
  1. <?php
  2. function przetwarzaj_dane ()
  3. {
  4.  if (formularz.zaw1.value == "tak" || formularz.zaw1.value == "tak" || formularz.zaw2.value == "tak" || formularz.zaw3.value == "tak" || formularz.zaw4.value == "tak" || formularz.zaw5.value == "tak" || formularz.zaw6.value == "tak" || formularz.zaw7.value == "tak" || formularz.zaw8.value == "tak" || formularz.zaw9.value == "tak" || formularz.zaw10.value == "tak" || formularz.zaw11.value == "tak" || formularz.zaw12.value == "tak" || formularz.zaw13.value == "tak" || formularz.zaw14.value == "tak" || formularz.zaw15.value == "tak" || formularz.zaw16.value == "tak" || formularz.zaw17.value == "tak" || formularz.zaw18.value == "tak" || formularz.zaw19.value == "tak" || formularz.zaw20.value == "tak" || formularz.zaw22.value == "tak" || formularz.zaw23.value == "tak" || formularz.zaw24.value == "tak" || formularz.zaw25.value == "tak"){
  5.    napis += "- Musisz wybrac conajmniej jeden zawod\n"
  6.    brakuje_danych=true;
  7.  }
  8.  if(brakuje_danych != ''){
  9.    alert ("Nie wypelniles nastepujacych pol:\n" + napis);
  10.  return false;
  11.  }
  12. }
  13. ?>

Chodzi tylko to z tym zawodem, reszta jest dobrze, bo inne walidacje działają (tylko nie wklejałem ich tutaj, żeby nie zaśmiecać kodu).

Proszę o pomoc.

P.S.: tak znaczy, że wybrane, a nie znaczy, że nie wybrane (w razie czego).
nospor
co to jest te zaw1 ?To są inputy czy checkboxy? Jak checkboxy to one wartosc zawsze mają niezaleznie czy je zaznaczysz czy nie. musisz sprawdzac atrybut checked

ps: ulatwij se sprawe i uzyj petli albo wogole nadaj klase i po klasie jedź. przeciez to co masz teraz to normalnie zalamka winksmiley.jpg

edit:
napis += ...
tę zmienną napis gdzies wczesniej deklarujesz? Bo jak nie to nie zdziw się ze mozesz dostac js errora

podobnie z brakuje_danych
in5ane
To jest wcześniej, inne walidacje działają, tylko nie wiem dlaczego ta nie działa. To są inpunty radio.
  1. var brakuje_danych=false;
  2.  var formularz=document.forms[0];
  3.  var napis="";



P.S.: Nie znam na JS, dlatego nie wiem jak tutaj zrobić pętlę. Ważne, żeby sprawdzało czy chociaż jeden zawód został wybrany.
kamil4u
Radio z tej samej grupy mają ta sam atrybut name, więc:
- var x = document.getElementByName
- pętla:
Kod
for(var i in x)  kod

- warunek:
Kod
if(x[i] <-- dalej Ci nie powiem żeby za prosto nie było (użyj checked, które musi się równać true) ) return true;

- po pętli :
Kod
return false;
in5ane
Za prosto nie było, dla mnie nic nie jest proste w JS, bo nie umiem tego, tylko gotowe wykorzystywałem, bo mi była potrzebna taka walidacja formularza ;/
kamil4u
Masz praktycznie wszystko podane prze ze mnie. Teraz wystarczy Google i po kolei:
- JS document.getElementByName
- checked JS chcebkbox

I to co napisałem skleić w jedną całość - tak naprawdę to wystarczy 2 słowa dopisać - dasz radę, jak Ci się nie uda pokaż nam swoje próby z kodem, który podałem...
in5ane
document.getElementsByName ma zwrócić mi dane z pól o takiej samej nazwie, no ale te pola mają różne nazwy...: zaw1, zaw2.. zaw24, zaw25.
kamil4u
Sorry źle przeczytałem:
Kod
<script>
function x(){
for(var i=1; i<= /* tu podajesz liczbę tych pól*/; i++)
if(document.getElementsByName("zaw"+i)[0]./* tu to chcecked co miałeś sprawdzić */ == true) return true;
return false;
}

if(x()) alert("OK"); else alert("Zaznacz coś");
</script>


Pozdrawiam
in5ane
Nie wiem, czy my się zrozumieliśmy, te pola zawodów są typu radio i mają wartość tak lub nie.

W tamto miejsce wiem, że trzeba wstawić poprostu checked.
kamil4u
To chyba się nie rozumiemy - napisz jakie masz pola radio i co chcesz dokładnie uzyskać
in5ane
Mam taki formularz: http://dancepiotrkow.pl/formularz.php

I musi zostać wybrany chociaż jeden zawód. I żeby to było w funkcji w JS w tej przetwarzaj_dane(). Proszę o pomoc. To pilne.
kamil4u
A nie lepiej zrobić checkbox i wtedy wykorzystać mój kod - wyżej?

No ale dobra - nie sprawdzałem:
Kod
<html>
<body>
<script type="text/javascript">
function funkcja(){

for(var i=1; i<=2; i++)
if(document.getElementsByName("zaw"+i)[0].checked) return true;

alert("Źle")
return false;
}
</script>

<form onSubmit="return funkcja();">
1:
<input type="radio" name="zaw1" value="tak">
<input type="radio" name="zaw1" value="nie" checked><br>

2:
<input type="radio" name="zaw2" value="tak">
<input type="radio" name="zaw2" value="nie" checked><br><br>
<input type="submit" value="sprawdz">
</form>


</body>
</html>
in5ane
Wszystko bardzo fajnie działa. Dodałem sobie to do tej mojej funkcji (to mi się udało w poniższy sposób), ale jest pewien problem, gdyż napis w alercie wyświetla mi się tyle razy ile razy się wykonuje pętla (czyli tyle ile jest tych zadań).

Dodałem to tak:
  1. for(var i=1; i<=25; i++)
  2. if (!document.getElementsByName("zaw"+i)[0].checked) {
  3. napis += "\nMusisz zaznaczyc conajmniej jeden zawod\n"
  4. brakuje_danych=true;
  5. }


I czy da się jakoś zakończyć te pętlę przed napis +=? Już próbowałem breakiem, ale to wtedy nie działało w ogóle.

Musiałem do IF'a dopisać ! aby to działało pod mój skrypt.
k_@_m_i_l
  1. for(var i=1; i<=25; i++)
  2. {
  3. if (!document.getElementsByName("zaw"+i)[0].checked)
  4. {
  5. napis += "\nMusisz zaznaczyc conajmniej jeden zawod\n";
  6. break; // wychodzi z pętli,dzięki czemu wypisuje tylko jeden komunikat o braku zawodu.
  7. }
  8. }
in5ane
A to brakuje_danych=true; gdzie wstawić?
kamil4u
Pokaż wszystkie części kodu, które są związane z tym smile.gif
in5ane
  1. <script type="text/javascript">
  2. function przetwarzaj_dane ()
  3. {
  4. var brakuje_danych=false;
  5. var formularz=document.forms[0];
  6. var napis="";
  7. for(var i=1; i<=25; i++)
  8. if (!document.getElementsByName("zaw"+i)[0].checked) {
  9. napis += "\nMusisz zaznaczyc conajmniej jeden zawod\n"
  10. brakuje_danych=true;
  11. }
  12. if(brakuje_danych != ''){
  13. alert ("Nie wypelniles nastepujacych pol:\n" + napis);
  14. return false;
  15. }
  16. return true;
  17. }


No i chodzi o to, że komunikat wyświetla się 25 razy, ale tak to działa.

@k_@_m_i_l: zrobiłem tak, dopisując brakuje_danych=true; przed tym breakiem i rzeczywiście wyświetla się raz jako jeden, ale nie działa.
@kamil4u: może ty będziesz miał pomysł.

Z góry dziękuję.
k_@_m_i_l
  1. <script type="text/javascript">
  2. function przetwarzaj_dane ()
  3. {
  4. var brakuje_danych=false;
  5. var formularz=document.forms[0];
  6. var napis="";
  7. for(var i=1; i<=25; i++)
  8. if (!document.getElementsByName("zaw"+i)[0].checked && !brakuje_danych) {
  9. napis += "\nMusisz zaznaczyc conajmniej jeden zawod\n"
  10. brakuje_danych=true;
  11. }
  12. if(brakuje_danych != ''){
  13. alert ("Nie wypelniles nastepujacych pol:\n" + napis);
  14. return false;
  15. }
  16. return true;
  17. }

Spróbuj tak : Sprawdza czy element jest zaznaczony i czy zmienna brakuje danych jest równa true(tzn. zwraca true jeśli jest false), jeśli zmienna bedzie true,tzn. komunikat jest wpisany nie dopisze do napisu.Musi teraz działać smile.gif
kamil4u
Nie sprawdzałem - nie zauważyłem, że to już zostało podane takie rozwiązanie - widocznie wtedy coś źle zrobiłeś - bo tak działa:
Kod
<script type="text/javascript">
function przetwarzaj_dane ()
{
var brakuje_danych=false;
var formularz=document.forms[0];
var napis="";
for(var i=1; i<=25; i++)
if (!document.getElementsByName("zaw"+i)[0].checked) {
napis += "\nMusisz zaznaczyc conajmniej jeden zawod\n";
brakuje_danych=true;
break;
}
if(brakuje_danych){
alert ("Nie wypelniles nastepujacych pol:\n" + napis);
return false;
}
return true;
}
</script>
in5ane
k_@_m_i_l: w ogóle nie wyświetla się alert.
@kamil4u: no i wyświetla się alert (ale już jeden), ale jak zaznaczę jedną opcję to i tak nadal jest ten alert. Przy tym Twoim jak zaznaczę wszystkie to znika wtedy alert.

tutaj proszę zerknąć w razie czego: http://dancepiotrkow.pl/formularz.php
k_@_m_i_l
  1. <script type="text/javascript">
  2. var zawod_wynik = false; //tworzymy zmienną w której przechowujemy wynik sprawdzenia czy wybrano zawód
  3. for(var i=1; i<=25; i++)
  4. {
  5. if (document.getElementsByName("zaw"+i)[0].checked)
  6. {
  7. zawod_wynik = true; // gdy zawód jest wybrany zapisujemy do zmiennej prawde
  8. }
  9. }
  10. //sprawdzamy czy wybrano zawód
  11. if(!zawod_wynik)
  12. {
  13. //jeśli nie wybrano zawodu
  14.  
  15. napis += "\nMusisz zaznaczyc conajmniej jeden zawod\n";
  16.  
  17. }


Tam był problem w tym,że używałeś zmiennej brakuje_danych do sprawdzania wielu wyników if'ów i nadpisywało wartość.
in5ane
@k_@_m_i_l: nareszcie mi ktoś pomógł. Chyba mnie zmobilizujesz do nauki JavaScript.

@kamil4u: ty też włożyłeś w to trochę serca, dlatego Tobie też dziękuję.
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.