Walidacja pola name jako tablicy w js


(Aglasek) #1

Witam,

Mam kilka pól w formularzu typu:

i funkcje w js do sprawdzania czy pole zostało wypełnione:

function checkForm(){

            var found = true;

            if( document.forms[0].question[0].value == "") //co mam tutaj wpisać zamiast question[0]

                found = false;

            if(found == true){

                document.getElementById("form").submit();

            }

            else

                alert("Wypełnij poprawnie wszystkie pola");

        }

i teraz jak zrobić aby sprawdzić czy wszystkie pola z name="question[]" zostały wypełnione, bo to z question[0] nie działa nawet gdy wpisze tylko jedno pole.


(Pablo_Wawa) #2

Takie coś Ci nie zadziała, ponieważ JS nie zinterpretuje Ci nazwy "question[]" jako tablicy - to będzie ciągle tylko zwykła nazwa, ale przez te nawiasy [] nie będzie można się do tego pola odwołać tak jak to napisałeś, tylko przez document.forms[0].item("question[]").

Taki "tablicowy" zapis nazwy pola chyba interpretuje PHP (ale to po stronie serwera) i wtedy to ma sens.


(Aglasek) #3

rozumiem ze miałem zamienić na to: document.forms[0].item("question[]") ale to nie działa. Więc jaki jest sposób aby zrobić walidację pola takiego typu za pomocą js?


(czytacz) #4

...a nie lepiej zrobić walidacji za pomocą php? Jak ktoś będzie miał wyłączony js to nie będziesz miał żadnej weryfikacji wprowadzanych danych.

Sam na początku chciałem oprzeć walidację formularzy przez js, ale potem uznałem, że nie zapewnia to właściwej pracy.


(Aglasek) #5

Tak może i lepiej, zgadzam się, tylko to mi wykasuje wszystkie do tej pory wprowadzone dane bo strona zostanie przecież przeładowana a mój formularz jest dość długi


(Pablo_Wawa) #6

Rzeczywiście item nie działa - pisałem "z pamięci" - przepraszam.

Zadziała document.forms[0].elements["question[]"], można też iterować elementy liczbami (od 0), np. document.forms[0].elements[0]

Walidację w PHP warto robić, a zachowanie wprowadzonych danych da się zrobić po prostu tak, że zamiast wyświetlać pusty formularz, wyświetlasz go z jakby otrzymanymi danych (metodą POST lub GET) i gotowe.

Czyli przykładowo (znów z pamięci piszę):

ewentualnie poprawić z użyciem isset():

P.S. Walidacja po stronie klienta czasami jest wygodna i prostsza (dla użytkownika).


(Aglasek) #7

Było by dobrze w ten sposób: document.forms[0].elements["question[]"] jednak u mnie to trochę bardziej skomplikowana sprawa ponieważ pola formularza mam generowane dynamicznie czyli też przez js a to document.forms[0].elements["question[]"] poprawnie mi sprawdza tylko pierwsze pole natomiast pozostałych utworzonych dynamicznie ale z tym samym name="question[]" już nie bierze pod uwagę ;/ Pytanie: jak zrobić aby brało wszystkie pola z name="question[]" pod uwagę nawet te utworzone dynamicznie?


(Pablo_Wawa) #8

Może użyj takiej konstrukcji:

var pola=document.forms[0].getElementsByName("question[]");

W zmiennej pola będziesz miał wszystkie elementy z tą nazwą.

I teraz możesz to "obrabiać" w pętli:

for (el in pola)

if (pola[el].value=="")

found = false;

Możesz też sobie iterować te nazwy:

lub tak jak napisałem wcześniej iterować pola formularza indeksem:

document.forms[0].elements[0]

document.forms[0].elements[1]

document.forms[0].elements[2]


(Aglasek) #9

Ok wygląda na to ze działa.

Ostatnie pytanie to jak przesłać pola id="question[]" za pomocą jquery i funkcji ajax? Bo pojedyncze pole to bez problemu z wykorzystaniem id="question"

var question = $("#question").val();


            $.ajax({

                      type: "POST",

                      url: "parser.php",

                      data: {question:question},

                              success: function(results) {

                                   $("#podglad").html(results);

                      }

            });

i działa ok bo w php i pliku parser.php robię tylko odebranie postem i działa

ale jak zrobić gdy id="question[]" ? Jak to przesłać do php?