19. maj 2007 - 22:00Der er
23 kommentarer og 1 løsning
Validering af flere forme og inputs
Hej Eksperter Er det muligt at få et script til tjekke flere forme med tekst felter samt chk bokse og radio. det skal være sådanne at den først skal finde ud af hvad der er af felter i formen om der er tekst og chk bokse og validere det eller om der er noget andet. det må også gerne være sådanne så den kan tjekke for mail
ja det er muligt. Men hvis vi skal hjælpe dig med at lave et så kunne det være fedt med nogle informationer om hvad formene indeholder (tekstfeltes navne, type osv.)
det den skal er at tjekke om felterene er tomme men i form1 er der ikke de samme felter som i form2 den skal selv finde ud af hvor mange chk, txt, r der er og validere de felter som er i formen
Tjah, det kan man jo så godt, men den er lidt tricky, for radios findes jo typisk i grupper med samme navn, og det vil betyde, at man skal lave noget underligt noget, for normalt vil man jo bare iterere igennem formens elementer, og så teste derfra, men gruppen skal jo testes samlet, men findes som flere elementer, der kun skal testes een gang ...
-- men f.eks. noget i denne henretning:
<script type="text/javascript"> function validerForm(f){ var rads = [], chks = [], fjl = null, result = ""; var e = f.elements, eType; for(i=0,im=e.length;im>i;i++){ eType = e[i].type; if(eType == "radio"){ if(rads[e[i].name]) continue; else rads[e[i].name] = "radio"; } if(eType == "checkbox"){ if(chks[e[i].name]) continue; else chks[e[i].name] = "checkbox"; } if(eType.indexOf("select")>-1 && e[i].selectedIndex == 0){ if(!fjl) fjl = e[i]; result += e[i].name + " har ikke valgt en værdi\n"; } if( (eType == "text" || eType == "textarea") && (e[i].value == e[i].defaultValue || e[i].value == "") ){ if(!fjl) fjl = e[i]; result += e[i].name + " er ikke udfyldt\n"; } if(e[i].name.indexOf("mail")>-1 && !e[i].value.match(/^.*?@\w[\w\.-]*\.[a-z]{2,6}$/i)){ if(!fjl) fjl = e[i]; result += e[i].name + " er ikke udfyldt med en mail-adresse\n"; } } for(n in rads){ var r = f.elements[n], chkd = false; for(i=0,im=r.length;im>i;i++) chkd = chkd || r[i].checked; if(!chkd){ if(!fjl) fjl = r[0]; result += n + " er ikke udfyldt\n"; } } for(n in chks){ var r = f.elements[n], chkd = false; for(i=0,im=r.length;im>i;i++) chkd = chkd || r[i].checked; if(!chkd){ if(!fjl) fjl = r[0]; result += n + " er ikke udfyldt\n"; } } if(fjl){ alert("Følgende fejl i udfyldningen blev fundet:\n\n" + result); fjl.focus(); return false; } return true; } </script>
-- og det er absolut utestet, skrevet direkte ind her, så der er sikkert en skønhedsfejl eller 3 !-)
Jeg har fjernet nederstående da den kom med 2 fejl for(n in chks){ var r = f.elements[n], chkd = false; for(i=0,im=r.length;im>i;i++) chkd = chkd || r[i].checked; if(!chkd){ if(!fjl) fjl = r[0]; result += n + " er ikke udfyldt\n"; } }
Jeg har så fundet ud af at jeg ikke kan få den til at komme med fejl på radio og checkbox som skal være i grupper. og jeg kunne godt tænke mig at man i et tlf felt kun skulle kunne sætte tal ind. så ville jeg høre om det er muligt at bruge et paremeter i <INPUT class=mailform_input name="kontakt_firmanavn"> for at den ikke skal i alert boksen med INPUT navnet men med noget man selv bestemmer.
Jeg kan godt lide det du har gjort med indexOf("mail") at bare navnet har noget med mail og gøre napper den som mail validering (Meget smart)
Efter at jeg havde sendt kalorius, kom jeg til at tænke på, at length ikke findes på elementer, der ikke er arrays, men jeg kunne lige så godt afvente andre kommentarer, og da der jo er et principielt problem med checkbokse (at det ofte er options, der er frivillige, men nogle gange er obligatoriske !-), er det svært at lave en algoritme, der holder ...
-- jeg har engang lavet en anden type validering, der var baseret på 'skygge'-inputs, hvor valideringen for det enkelte felt var angivet i disse skjulte inputs value, og umiddelbart vil jeg tro, at det er den vej, man skal rundt, hvis den form for hjælp skal med i outputtet ...
-- men ved enkelt-fejl er der jo ikke et problem, fordi der fokuseres på det felt, der har den første fejl ...
Grunden til at jeg spørger om den mulighed er at jeg er træt af hele tiden og difinere hvad det er for et felt og i hvad for en form i scriptet. og især hvis man har mange forme. men det kunne godt være at man kan gøre det på en smartere måde. EKS. med nogle paremeter i selve indput linien
onfocus og onblur er bare en klassisk 'Så ryd dog feltet'-ting ...
-- det, der gøres er, at der er lavet et 'skygge'-felt, hvor der står nogle regler for værdien ...
For minInput er der et valminInput-felt, hvor der står, at der skal være 4 til 5 store bogstaver, og teksten til alerten skal være 'Store bogstaver' (hvilket er teksten foran feltet !-)
For minInput2 er der et valminInput2-felt, hvor der står, at feltet skal indeholde en valuta-værdi, som i scriptet er defineret som en talfølge evt. med tusind-separator(er) og to cifre efter en decimal-separator ...
-- på den måde får man mulighed for, helt uden problemer med værdier eller html-regler, at have en speciel validering for hvert felt, og så have et helt generelt script, der kan bruges hver gang !o]
Se det er noget der liner det er f...... smart det er lige sådanne noget jeg er ude efter. Er det så muligt at lave det på samme måde på chk, radio (Grupper)
Ja, jeg har ikke lige tid nu, men det er 'bare' at tage mekanismen, der opsamler grupperne og så tilføje den og for(n in rads) til scriptet i 544411 !o]
-- jeg vender nok til bage i morgen, så kan jeg kigge på det (ellers er der nok en anden, der kommer forbi og kaqn hjælpe dig !-)
Hrm, absolut ikke testet for alvor, men ideen skulle være på plads:
<script type="text/javascript"> function valider(f){ var e = f.elements,val,min,max,fname,tval,chks = [], rads = []; for(i=0;e.length>i;i++){ if( (e[i].type=='text' || e[i].type=='textarea') && e[i].name.indexOf('val')!=0){ fname = max = min = 0; val = e['val'+e[i].name].value; tval = val.split("(")[1].split(")"); fname = tval[1]; min = tval[0]; if(min.indexOf(",")>0){ max = +min.split(",")[1]; min = +min.split(",")[0]; } val = val.split("(")[0];
if(min&&min>e[i].value.length||max&&e[i].value.length>max){ alert('Værdien i ' + ((fname)?'"'+fname+'"':e[i].name) + ' overholder ikke kravene til længde') e[i].focus(); return false; }
var t = "\\wáàãââæåçéèêëìíîïñòóôõöøùúûüýÿ"; var regexpmail = new RegExp("^["+t+"]["+t+"\\.\\-\\+]*@["+t+"]["+t+"\\.\\-]*\\.["+t+"]{2}["+t+"\\.\\-\\/]*$","i");
switch(val){ case('char'): if(!/^\w+$/i.test(e[i].value)){ alert('Værdien i ' + ((fname)?'"'+fname+'"':e[i].name) + ' overholder ikke kravet om kun at bruge tegn') e[i].focus(); return false; } break; case('caps'): if(!/^[A-Z]+$/.test(e[i].value)){ alert('Værdien i ' + ((fname)?'"'+fname+'"':e[i].name) + ' overholder ikke kravet om kun at bruge store bogstaver') e[i].focus(); return false; } break; case('number'): if(!/^\d+$/.test(e[i].value)){ alert('Værdien i ' + ((fname)?'"'+fname+'"':e[i].name) + ' overholder ikke kravet om kun at bruge tal') e[i].focus(); return false; } break; case('curr'): if(!/^\d+([,\.]\d{3})*([,\.]\d\d)?$/.test(e[i].value)){ alert('Værdien i ' + ((fname)?'"'+fname+'"':e[i].name) + ' overholder ikke kravet om at bruge valuta-notation') e[i].focus(); return false; } break; case('mail'): if(!regexp.test(e[i].value)){ alert('Værdien i ' + ((fname)?'"'+fname+'"':e[i].name) + ' overholder ikke kravet om en mail-adresse') e[i].focus(); return false; } break; default:
} }else if(e[i].type == "checkbox" && f.elements["val" + e[i].name]){ if(!chks[e[i].name]) chks[e[i].name] = "checkbox"; } }else if(e[i].type == "radio" && f.elements["val" + e[i].name]){ if(!rads[e[i].name]) rads[e[i].name] = "radio"; } } for(n in chks){ var chs = f.elements[n],chkd = false; if(chs.length){ for(i=0,im=chs.length;im>i;i++) chkd = chkd || chs[i].checked; if(!chkd){ alert("I " + n + " er der ikke foretaget et valg"); chs[0].focus(); return false; } } } for(n in rads){ var rds = f.elements[n],chkd = false; if(rds.length){ for(i=0,im=rds.length;im>i;i++) chkd = chkd || rds[i].checked; if(!chkd){ alert("I " + n + " er der ikke foretaget et valg"); rds[0].focus(); return false; } } } return true; } </script>
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.