22. juli 2005 - 12:10Der er
8 kommentarer og 1 løsning
Generisk validering
Hejsa.
Jeg har en formular med virkelig mange felter. Der er dog en række fællesnævnere for alle felterne, nemlig deres navngivning. Felterne er f.eks. navngivet med strXXXX eller intXXXX for henholdsvis strenge eller heltal.
Strenge må i alle tilfælde kun være 255 tegn lange, og heltal skal selvsagt være heltal.
Der er én undtagelse, nemlig et felt der hedder strKommentarer, som er et notatformat felt, og dette skal ikke valideres - det bliver gjort serverside senere. Selve formen, som felterne er i, har ikke et id nummer, men kan tilgåes med document.forms[0]
Jeg havde forestillet mig noget der minder om følgende mockcode:
For hver element i formularen gør følgende Find type på element
Hvis type er str og ikke strKommentar Valider max 255 tegn
Hvis type er int Valider heltal
Næste
Det ville i hvertfald, give god mening, men jeg er ikke så skide god til javascript. Er der nogen der har et eller andet på lager, der kan klare dette let og smertefrit?
Det kunne være en funktion noget lign. denne her (der med sikkerhed kan laves mere fiks):
function validateForm() { var bValid = true; for(var i = 0; i < document.forms[0].elements.length; i++) { if(document.forms[0].elements[i].name.substr(0,3) == "str") { if(document.forms[0].elements[i].name != "strKommentar") { bValid = bValid && document.forms[0].elements[i].value.length < 256; } } else if(document.forms[0].elements[i].name.substr(0,3) == "int") { // her bør der laves en regular expression for at teste om der er // andet end tal i feltet, men jeg klarer det lige med denne // fattigmandsmetode, hvor jeg sammenligner resultatet af parseInt // med indholdet af feltet (og isNaN)... var iVal = parseInt(document.forms[0].elements[i].value); bValid = bValid && !isNaN(iVal) && document.forms[0].elements[i].value != iVal; } }
Med en monster-formular ville jeg nok sørge for at komme men en meddelelse, som fortalte hvor mange fejl, der var, og sætte fokus på det første felt, hvor der var en fejl, f.eks. således:
function valider(f){ var flt = null, e = f.elements, msg = ""; for(i=0;e.length>i;i++){ if(e[i].name.indexOf('int')==0){ if(!e[i].value.match(/^\d+$/){ msg += "\t" + e[i].name + " må kun indeholde tal\n"; if(!flt)flt = e[i] } }else if(e[i].name.indexOf('strK')==-1 && e[i].name.indexOf('str')==0){ if(!e[i].value.match(/^.{1,255)$/){ msg += "\t" + e[i].name + " skal indeholde 1 - 255 tegn\n"; if(!flt)flt = e[i] }
} } if(flt){ alert('Der er fejl i formen, følgende felter indeholder fejl:\n'+msg); flt.focus(); return false; } return true; }
-- og en bedre måde at teste tekst-inputs vil nok være at sige, at de skal starte med et bogstav eller tal:
if(!e[i].value.match(/^[\wæøå].{0,254)$/i){
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.