noviKorisnik: za radio dugmiće nisam proveravao (nisam se setio), tako da si u pravu, ono neće raditi. ali za select nisam upoređivao sa nulom (umesto sa -1) zato što mi nisu pali na pamet višeredni selekti (a oni se ionako uglavnom koriste kada je multiselekt, što nema smisla proveravati ovakvom funkcijom), a ne da bi skratio kod.
kod sam znatno skratio tek naknadno (u drugoj poruci) kada sam video da je to moguće uraditi..
dakle, evo ispravljene verzije, koja radi i sa radio dugmićima i sa višerednim selektima..
Code:
function validate_required(form, elements, submit) {
function validate() {
submit.disabled=true;
if (this.type=='radio' && this.checked) {
form[this.name].checked = true;
}
for (var i in elements) {
var e = elements[i];
if (e.type=='text' && !e.value.length) return;
if (e.type=='checkbox' && !e.checked) return;
if (e.type=='radio' && !form[e.name].checked) return;
if (e.type=='select-one' && e.selectedIndex<(e.size<2)) return;
}
submit.disabled=false;
return true;
}
form = document.forms[form];
form.onsubmit = function() {return !!validate()};
submit = form.elements[submit];
for (var i in elements) {
for (var j=0; j<form.length; j++) {
var e = form[j];
if (elements[i]==e.name || elements[i].name==e.name) {
elements[i] = e;
e.onchange = e.onkeyup = e.onclick = validate;
e.onchange();
}
}
}
}
poziva se isto kao i prethodna, i važi sve što sam rekao za nju.. kada je selekt jednoredni, opet mora da se žrtvuje prva opcija da glumi neselektovanu. kada je višeredni, onda ne mora..
btw, ovo je vrlo dobar primer da je validate() funkcija lako proširiva..
bluesman: znam da može tako, i to bi recimo još više uprostilo onu duplu petlju u funkciji, ali nisam tako hteo iz dva razloga:
- neko je možda čistunac, pa želi da mu html bude validan, tj bez dodatnih atributa. (mada, ovo se može rešiti sa atributima u novom namespace-u, ali to je komplikovanje..)
- i nekako mi se više sviđa ideja da na jednom mestu lepo pozovem funkciju, sa svim potrebnim parametrima, nego da jurim elemente i dodajem im atribute (isto kao što nisam voleo da im dodajem evente ručno..)
mada definitivno je ideja dobra, i nekome se može svideti. ako neko želi, mogu da odradim i tu verziju funkcije..