Avatar billede jackass- Nybegynder
16. januar 2008 - 20:57 Der er 16 kommentarer og
1 løsning

Form input validering inden submit

Hej,

Jeg vil gerne lave noget validering på en form således at den besøgende udelukkende må taste bogstaver, tal og "-" samt "_".

Som et alternativ til at bruge en regular expression som fx "/^[A-Fa-f0-9_-]$/" på hvert POST-variabel i actionscriptet, kunne det være rart at validere allerede når brugeren udfylder formen (også så vedkommende undgår at skulle gå tilbage og udfylde igen).

Er der nogen der ved (og gerne kan give et eksempel på) hvordan man laver noget med javascript i denne stil måske?

<input name="blabla" type="text" id="blabla" onkeydown="tjek om tast er valid, ellers alert() og lad brugeren rette det">

Håber nogen forstår hvad jeg mener med ovenstående og har et løsningsforslag :)

Mvh
jack
Avatar billede jackass- Nybegynder
16. januar 2008 - 21:04 #1
Hov.. glemte lige at sige: det skal jo være en skudsikker løsning som holder i alle browsere, og det er jeg i tvivl om overhovedet kan lade sig gøre? Hvad hvis man disabler javascript i browseren?

Ellers er eneste sikre måde jo desværre at validere i action-scriptet med regex eller lign.
Avatar billede nielle Nybegynder
16. januar 2008 - 21:18 #2
Lige det viste tilfælde er så tilstrækkeligt simpelt at det faktisk kan gøres med den regexp du har angivet:

<script language="javascript">
function validate(elm) {
    text = elm.value

    if (! /^[a-f0-9_-]+$/i.test(text) ) {
        alert("Kun bogstaveren a-f, ciffrene 0-9, eller '_' og '-'.")
    }
}
</script>

<form name="xxx">
<input name="blabla" type="text" id="blabla" onkeyup="validate(this);">
...
</form>

(Jeg har tilføjet et '+' fordi jeg gætter på at du glemte det?)


Den burde gælde på alle browsere der har JavaScript enablet.

Du finder ikke nogen løsning som også fungere på browser, hvor client-side scripting er disablet. Det er jo ligesom nærmest definitionen af "disablet" at der ikke kan køres kode på dem lokalt. Disse tilfælde kan du kun håndtere ved server-side script - dvs. efter at folk har submittet deres input (og denne validering skal du jo under alle omstændigheder have alligevel).
Avatar billede jackass- Nybegynder
16. januar 2008 - 22:00 #3
Super.. lige i skabet! Én lille ting: når man trykker backspace for at slette det ulovlige tegn.. kan man allow det - eller endnu bedre: automatisk slette det ulovlige tegn fra feltet samtidig med man fyrer alert() af?
Avatar billede jackass- Nybegynder
16. januar 2008 - 22:00 #4
det jeg prøvede på at skrive var, at backspace også resulterer i en alert() :)
Avatar billede nielle Nybegynder
16. januar 2008 - 22:20 #5
Backspace resultere ikke i sig selv i at der smides en alert. Jeg gætter på at du får den fordi at du skriver et enkelt tegn og så backspacer det. Dette vil jo resulterer i en tom streng som ikke er tilladt fordi at '+' i regexp'en betyder "1 eller flere". Prøv selv at skrive mere end et tegn ør at du backspacer.

Det kan rettes ved at ændre '+' til '*' som betyder "0 eller flere".


Den med at automatisk slette det ulovlige tegn er straks lidt mere tricky. For hvad nu hvis brugeren indtaster tegnet midt inde i alt den anden tekst? Hvilket tegn er det så der skal fjernes.
Avatar billede jackass- Nybegynder
16. januar 2008 - 22:24 #6
You got a point.. Anyway, glimrende "up-front" løsning, og derudover validering i action-scriptet, så skulle den være hjemme.

Tak for hjælpen, smider du et svar? :)
Avatar billede nielle Nybegynder
16. januar 2008 - 22:27 #7
Svar :^)
Avatar billede jackass- Nybegynder
16. januar 2008 - 22:43 #8
Hov.. lige en detalje.. den skal også tillade '@'.. men dette virker ikke?

if (! /^[a-zA-Z0-9_-@]*$/i.test(text) ) {
Avatar billede olebole Juniormester
16. januar 2008 - 22:49 #9
<ole>

Mon ikke bindestregen skal stå sidst? Ellers har den en anden betydning - nemlig den samme som ved 'a-z', 'A-Z' og '0-9'. I øvrigt er der ingen grund til at bruge 'A-Z', når du bruger i-modifier'en

/mvh
</bole>
Avatar billede jackass- Nybegynder
16. januar 2008 - 23:01 #10
Nåe ja.. hehe :)
Avatar billede nielle Nybegynder
17. januar 2008 - 18:20 #11
Med det lille 'i' i "/.../i" behøver du ikke at liste både store og små bogstaver:

if (! /^[a-z0-9_-@]*$/i.test(text) ) {

Desuden kan "a-z", "0-9", og '_' slås sammen som "\w":

if (! /^[\w@-]*$/i.test(text) ) {

(som dog lidt af omstændighederne også kan finde på at inkludere 'æ', 'ø' og 'å').
Avatar billede roenving Novice
19. januar 2008 - 15:06 #12
-- og ü, ñ med mange flere !-)
Avatar billede jackass- Nybegynder
21. januar 2008 - 09:02 #13
Supah.. smider du svar? :)
Avatar billede nielle Nybegynder
21. januar 2008 - 19:28 #14
Det kan man ikke når spørsmålet allerede er lukket.

Men jeg kan da gøre det:

http://www.eksperten.dk/spm/815855
Avatar billede jackass- Nybegynder
21. januar 2008 - 23:00 #15
Hehe hov, havde ikke lige set jeg allerede havde accepteret denne :D My bad..
Avatar billede roenving Novice
23. januar 2008 - 00:56 #16
-- men er det ikke nielle, der skal have alle pointene, også for bonus-info ?-)
Avatar billede jackass- Nybegynder
23. januar 2008 - 06:42 #17
Jo.. det fik han også? :)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester