Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: formularz + js
Forum PHP.pl > Forum > PHP
attimo
Witam,

Chce zrobić formularz który przy błędnym wpisaniu któregoś z pól nie będzie odświeżał strony tylko wyświetli komunikat gdzie znajduje się błąd.

Formularz wygląda tak:
  1. <form action = "<? echo $_SERVER['PHP_SELF'];?>"method = "post" name="forma" onsubmit="sprawdz()" >

poniżej pola np.
  1. <input type='text' name='imie'/>
  2. <input type='submit' name='ok' value='ok'/>


kod js

[JAVASCRIPT] pobierz, plaintext
  1. <script type="text/javascript">
  2. function sprawdz()
  3. {
  4. var imie = document.forms['forma']["imie"].value;
  5. if (imie == "")
  6. {
  7. alert("nic nie wpisales");
  8. }
  9. }
  10. </script>
[JAVASCRIPT] pobierz, plaintext


Nie sugerujcie się treścią to tylko prosty przykład opisujący mój problem polegający na tym, że strona się odświeża a chce aby wyświetlił sie tylko błąd bez odświerzania.
kur3k
Nie piszę w JS, jednak bym wrzucił to w pętle ;>

Ale pamiętaj, że nie każdy obsługuje JS.

Masz w PHP
  1. <?php
  2. if (empty($_POST['submit'])) {
  3. echo "<form method=\"post\" action=\"\">
  4. <table summary=\"Formularz zamówienia\" class=\"formularz\">
  5. <tr>
  6. <td>Imię, nazwisko:</td>
  7. <td><input type=\"text\" name=\"imie\" class=\"kontakt_pola\" /></td>
  8. </tr>
  9. <tr>
  10. <td>Numer kontaktowy:</td>
  11. <td><input type=\"text\" name=\"kontakt\" class=\"kontakt_pola\" /></td>
  12. </tr>
  13. <tr>
  14. <td>Adres e-mail:</td>
  15. <td><input type=\"text\" name=\"email\" class=\"kontakt_pola\" /></td>
  16. </tr>
  17. <tr>
  18. <td>Wiadomość:</td>
  19. <td><textarea name=\"tresc\" rows=\"\" cols=\"\" class=\"kontakt_tresc\"></textarea></td>
  20. </tr>
  21. <tr>
  22. <td></td>
  23. <td><input type=\"submit\" name=\"submit\" value=\"Wyślij\" class=\"kontakt_przycisk\" /> <input type=\"reset\" value=\"Usuń\" class=\"kontakt_przycisk_dwa\" /></td>
  24. </tr>
  25. </table>
  26. </form>"; }
  27. elseif (!empty($_POST['imie']) && !empty($_POST['kontakt']) && !empty($_POST['email']) && !empty($_POST['tresc']))
  28. {
  29. $message = "\nImię, naziwsko: $_POST[imie]\n\nNumer kontaktowy: $_POST[kontakt]\n\nAdres e-mail: $_POST[email]\n\nTresc wiadomości: $_POST[tresc]";
  30. $header = "From: $_POST[email]";
  31. @mail("pawel@niewazne.pl","POSITUM - nowa wiadomosc!","$message","$header")
  32. or die('<br /> Forumlarz konatktowy aktualnie nie działa poprawnie, spróbuj ponownie!');
  33. echo "<div id=\"kontakt_wiadomosc\">Wiadomość została wysłana poprawnie!</div> <br /> Postaramy się odpisać jak najszybciej jest to możliwe, czekaj!";
  34. }
  35. else echo "<div id=\"kontakt_blad\">BŁĄD - wypełnij wszystkie pola formularza kontaktowego!</div> <br /> Wróć do działu <a href=\"kontakt\" title=\"\">kontakt</a>.";
  36. ?>
Nie będę Ci podawać kodu CSS, sam sformatuj sobie już :]
QooBooS
Witam.
Wystarczy dodać mały szczegół - return.
Oprócz tego proponuję zrobić to nieco inaczej:
funkcję niech wywołuje wciśnięcie przycisku 'OK', a nie zdarzenie onSubmit formularza.
Będzie to wyglądało tak:
Z form usuwasz zdarzenie onSubmit:
  1. <form action = "<? echo $_SERVER['PHP_SELF'];?>"method = "post" name="forma">

Do przycisku 'OK' dodajesz onClick i zmieniasz go z type='submit' na type='button':
  1. <input type='button' name='ok' value='OK' onClick='return sprawdz();'/>

A w funkcji dodajesz odpowiednio:
  1. <script type="text/javascript">
  2. function sprawdz(){
  3. var imie = document.forms['forma']["imie"].value;
  4. var nazwisko = document.forms['forma']['nazwisko'].value;
  5. if (imie == "")
  6. {
  7. alert("Nie wpisales imienia!");
  8. return false;
  9. } else if (nazwisko == "")
  10. {
  11. alert("Nie wpisales nazwiska!");
  12. return false;
  13. } else {
  14. return true;
  15. document.forms['forma'].submit();
  16. }

Co tu zrobiłem:
Sprawdzasz każde pole z osobna. Jeśli jest puste, wyświetlasz komunikat i nie wysyłasz formularza, a jeśli wszystkie są wypełnione - zwraca true i wykonuje submit() dla formularza (innymi słowy - wysyła go smile.gif). Pole nazwisko wymyśliłem, żeby pokazać Ci, jak to wygląda z większą ilością pól.
attimo
Niestety po kliknieciu w przycisk nic sie nie dzieje

Wiecie może dlaczego ?
gothye
zobacz jak to wygląda u mnie (wyszukiwarka prosta) :

  1. <script type='text/javascript'>
  2. function checkform(frm){
  3. if(frm.f_key.value==''){
  4. alert('Łatwiej będzie mi coś znaleść jeśli podasz czego mam szukać :) ');
  5. return false;
  6. }
  7. }
  8. </script>
  9.  
  10. <form method="post" action="{$ROOT}/szukaj" onsubmit='return checkform(this);'>
  11. <input type="text" class="text" value="" name="f_key" id="s">
  12.   <input type="submit" value="Szukaj" name="s_key">&nbsp;&nbsp;<a href='szukaj'>Zaawansowane szukanie</a>
  13. </form>



wiiir
dodatkowo mozesz po kazdej zmianie pola sprawdzic wartosc pola poprzez onChange
jesli pola te definiuja np email login itd mozesz ajaxem sprawdzic czy email jest wolny czy nie, poczym podac odpowiednia informacje przy danym polu
jesli nie chcesz wyslac formularza z bledami mozesz zrobic sobie funkcje js ktora zbada ci wszystkie pola a pozniej wywola submit
czyli document.nazwa_fomularza.submit...
attimo
Poprawiłem kod i teraz działa poprawnie tylko mam jeszcze jedno pytanie.

np.
[JAVASCRIPT] pobierz, plaintext
  1. function sprawdz(){
  2. var imie = document.forms['forma'].imie.value;
  3. var nazwisko = document.forms['forma'].nazwisko.value;
  4. var haslo = document.forms['forma'].haslo.value;
  5. if(imie == "")
  6. {
  7. alert("nie wpisales imienia");
  8. return false;
  9. }
  10. else if(nazwisko == "")
  11. {
  12. alert("nie wpisales nazwiska");
  13. document.forms['forma'].nazwisko.style.border = "2px solid #FF0000";
  14. return false;
  15.  
  16. }
  17. else if(haslo == "")
  18. {
  19. alert("Nie wpisales hasla");
  20. return false;
  21. }
  22. else
  23. {
  24. return true;
  25. }
  26. }
[JAVASCRIPT] pobierz, plaintext



Ustawiłem styl w razie gdyby nazwisko zostało źle wpisane, teoretycznie działa. Tylko, że jeśli wpisze coś do tego pola nadal jest aktywny ten styl czyli czerwona ramka a chciałbym aby po wpisaniu było normalnie.
QooBooS
Zrób tak:
Do pola, które ma być wyróżnione (nazwisko), dodaj:
  1. onChange="document.forms['forma'].nazwisko.style.border = 'none';"

Teraz po zmianie zawartości pola, ramka będzie automatycznie usuwana.
Możesz też zamiast onChange użyć onFocus - wtedy ramka zniknie po uaktywnieniu tego pola (np. kliknięciu w nim)
attimo
Z tym sobie poradziłem, ale bez Ajaxa to raczej nie ma sensu. Jeśli pole to np. login to po przejsciu do następnego trzeba byłoby sprawdzić to poprzednie z użyciem php a dokładniej sprawdzić czy w bazie nie ma już takiego użytkownika. mógłbym użyć dla inputa onChange ale nie bardzo wiem jak miała by wyglądać taka funkcja sprawdzająca w ajaxie.
wiiir
ajax nie sluzy do sprawdzania twoich pol tylko komunikacji z serwerem.. musisz napisac sobie funkcje ktora pobierze wartosc pola, nastepnie zbudowac sobie ajaxa, albo skorzystac z gotowych rozwiazan typu jQuery, ajax, wysle ci ta wartosc do skryptu php, w php sprawdzasz sobie czy istnieje np uzytkownik, pozniej musisz jeszcze obsluzyc powrot ajaxa i koniec, nie wiem jak dziala ajax w jQuery bo korzytam ze swojego ajaxa, u mnie jest tak ze w powrocie wykonywana jest funkcja taka jaka wsakrze przy wywolaniu ajaxa,
np:
  1. ajax(plik.php, parametry, funkcja przy powrocie)


teraz mi przyszlo do glowy ze JQ fajnie obsluguje JSON-a wiec mozesz sobie zwrocic json-a a potem tylko eval();
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.