26. februar 2004 - 19:53Der er
15 kommentarer og 1 løsning
Tjek forskellige forms med samme kode!
Title er måske lidt underlig.
Er det ikke muligt at i en javascript-fil (.js), som jeg henter en i hovedet af mit html-dokument, at erklære hvad f.eks. et brugernavn må indeholde. F.eks.:
if (!(document.register.username.value.length >= 3 && document.register.username.value.length <= 20 && document.register.username.value.match(/^[a-z0-9_\-]+$/i))) { alert('Please specify a valid username!'); document.register.username.focus(); return false; }
Og så have en masse forskellige erklæringer af hvad forskellige ting på indeholde.
Og så i hver enkelt form jeg har (login, oprettelse af bruger osv.) at angive hvilke felter i formen der skal tjekkes for hvad?
Således at jeg faktisk bruger den samme kode for hvad et brugernavn må indeholde til forskellige forms?
o-zone har nok ret i at det bliver svært at gøre det kønt. Har selv bakset lidt med noget og kom frem med dette, programmeringsmæssigt grimme, stykke kode: <script type="text/javascript"> function validateForm() { var i=0; var currentElm; var currentAlert; var currentElmValid = true; var validForm = true; while (i<arguments.length) { if (typeof arguments[i] == "object" && arguments[i].toString().indexOf("/") == -1) { currentElm = arguments[i];i++; if (!currentElmValid) { validForm = false; if (currentAlert) {alert(currentAlert);} } currentElmValid = true; } else {
if (typeof arguments[i] == "string") { switch (arguments[i].toString().slice(0,arguments[i].indexOf("="))) { case "max" : if (currentElm.value.length > parseInt(arguments[i].slice(arguments[i].indexOf("=")+1))) currentElmValid = false;break; case "min" : if (currentElm.value.length < parseInt(arguments[i].slice(arguments[i].indexOf("=")+1))) currentElmValid = false;break; case "alert" : currentAlert = arguments[i].slice(arguments[i].indexOf("=")+1);break; } } else if (arguments[i].toString().indexOf("/") == 0 && currentElm.value.search(arguments[i]) == -1) {currentElmValid = false;i++;continue;} else; i++; } } if (!currentElmValid) { validForm = false; if (currentAlert) {alert(currentAlert);} } return validForm; } </script>
Hmm, nej det er ikke pænt ;-) Kan det virkelig ikke gøres pænere?
Det gør ikke så meget at jeg skriver i min form hvad der skal tjekkes. Jeg kan godt lave en function f.eks. loginForm(), som så indeholde det der skal tjekkes og så kører jeg bare den når der trykkes på submit.
Men i loginForm skal der henvises til de tidligere kode med brugernavn osv., så jeg kan har dem ét sted.
Det er bare således at når jeg skriver hvad f.eks. et brugernavn skal indeholde, så skal jeg kun skrive det ét sted.
Sådan at jeg ikke laver den fejl at et brugernavn kan indeholde noget ét sted og noget ét andet sted. Altså for ikke at lave det samme arbejde flere gang end højst nødvendigt ;-)
du kunne vel gøre lidt det samme som din oprindelige funktion, men blot i stedet for at skrive: document.register.username bruger document.getElementsByName("username")[0] - eller hvis du har en id: document.getElementById("username") På den måde kan dit script virke på endhver side bare du kalder din loginboks for username - hvad enten det er en id eller en name.
Jeg skal vel stadig på en eller anden måde fortælle hvad login-formen skal tjekkes for. Den indeholder jo kun brugernavn og kodeord, hvorimod min registrerings-form indeholder meget andet?
det er fordi getElementsByName returnerer et array (egentlig er det et HtmlCollection object som de kalder det, men fungerer på samme måde) med alle elementer der har navnet "username". Normalt er name jo ikke kun tilgengængeligt for ét element ligesom id. Jeg regner dog med at du kun havde et element med dette navn, og derfor tager man bare det først - og eneste - element fra dette array.
Jeg tror at det ville være meget nemmere, hvis du smed 2-3 forms her ind.. Så kan man bedre se hvordan det hele hænger sammen, og man kan derfor nemmere finde en 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.