02. december 2005 - 08:50Der er
18 kommentarer og 1 løsning
Kun tal, komma og punktum i formfelt
Hej
Jeg har følgende script, som tjekker om der er tastet andet end tal i et formfelt. Er der nogen der kan udvidde scriptet, så man også får lov at indtaste komma og punktum?
hej renewester hvis scriptet skal fungere normalt er det på nuværende tidspunkt kun muligt i MSIE, i hvert fald hvis man bruger de nyeset browserversioner. Jeg har lavet et eks. her:
<html> <head> <title>Gyldigt tal eller ej?</title> <script type="text/javascript">
var pk = false; //Accepter punktum: true - accepter komma: false var msg = true; //Vis beskedboks ved ugyldige tal var msgModal = true; //Beskedboks modal: true - Beskedboks systemmodal: false var negativeTal = true; //Accepter negative tal var text = "Ugyldigt tal."; //Meddelelsesboksens tekst
som ved tryk ved en almindelig tast med et bogstav. Det er derfor ikke så smart at man, hvis man står i tekstfeltet og vil opdatere med F5, får en meddelelse om at man har indtastet et ugyldigt tal. Men ellers har du ret, har jeg lige fundet ud af. Her er en forbedret version med MSIE-, Firefox- og Netscapeunderstøttelse
<html> <head> <title>Gyldigt tal eller ej?</title> </head> <body> <input type="text" id="text" onkeypress="check();"> <script type="text/javascript">
var pk = false; //Accepter punktum: true - accepter komma: false var msg = true; //Vis beskedboks ved ugyldige tal var msgModal = true; //Beskedboks applikationmodal: true - beskedboks systemmodal: false - virker kun på Windows-platformen var negativeTal = true; //Accepter negative tal var text = "Ugyldigt tal."; //Meddelelsesboksens tekst
function check(e){ if(navigator.userAgent.indexOf("Opera") < 0){ use = (navigator.appName == "Microsoft Internet Explorer") ? window.event.keyCode : e.which; if(use == 0 || use == 8 || use == 13 || use == 27 || (use == 44 && !pk) || (use == 45 && negativeTal) || (use == 46 && pk)){} else if(use == 94 || use == 96 || use == 126 || use == 168 || use ==180) return false; else if(use < 48 || use > 57){ if(msg){ if(navigator.appName == "Microsoft Internet Explorer" && navigator.userAgent.indexOf("Win") >= 0) VBSMsg(text, 16 + ((msgModal) ? 0 : 4096), document.title); else alert(text); document.getElementById("text").focus(); return false; } } } } document.getElementById("text").onkeypress = check; document.getElementById("text").focus(); </script> <script type="text/vbscript"> function VBSMsg(a, b, c) MsgBox a, b,c end function </script> </body> </html>
I hendhold til Hallandsen-Soft A/S's kundeservicelov har bestyrelsen i samråd besluttet, for overskuelighedens skyld, at udstede følgende patch:
Linien
var msgModal = true; //Beskedboks applikationmodal: true - beskedboks systemmodal: false - virker kun på Windows-platformen
skal erstattes af linien
var msgModal = true; //Beskedboks applikationmodal: true - beskedboks systemmodal: false - virker kun på Windows-platformen og i Microsoft Internet Explorer.
Jeg har x-antal felter, som jeg vil tjekke ved at bruge samme script. Kan jeg sende en variabel eller lignende med i "onkeypress='check();'", så dit script "fanger det", så det derved bliver en mere generel funktion?
Det er desværre ikke muligt at sende nogen paramtere med funktionen, da den første vil overtage parameteren "e", som bruges til at bestemme, hvilken tast, der er trykket på i Firefox og Netscape :~(. Men du kan sagtens få funktionen til at acceptere punktummer i stedet for komma: Sæt blot pk til true. Skal man kunne indtaste begge dele så slet følgende lini:
Har du så ikke en anden ide til hvordan jeg kan få løst mit problem? Jeg vil gerne kunne bruge det samme javascript til x-antal felter, så jeg får tjekket et hvilket som helst formfelt for at der tastes (realtime med "onkeypress") andet end tal, komma eller punktum?
..lidt i samme stil som det script jeg allerede bruger, men som bare udvides til at acceptere komma og punktum...
var pk = false; //Accepter punktum: true - accepter komma: false var msg = true; //Vis beskedboks ved ugyldige tal var msgModal = true; //Beskedboks applikationmodal: true - beskedboks systemmodal: false - virker kun på Windows-platformen var negativeTal = true; //Accepter negative tal var text = "Ugyldigt tal."; //Meddelelsesboksens tekst
var i = 1; while(document.getElementById("text" + i)){ eval('function check' + i + '(e){if(navigator.userAgent.indexOf("Opera") < 0){use = (navigator.appName == "Microsoft Internet Explorer") ? window.event.keyCode : e.which;if(use == 0 || use == 8 || use == 13 || use == 27 || (use == 44 && !pk) || (use == 45 && negativeTal) || (use == 46 && pk)){}else if(use == 94 || use == 96 || use == 126 || use == 168 || use ==180)return false;else if(use < 48 || use > 57){if(msg){if(navigator.appName == "Microsoft Internet Explorer" && navigator.userAgent.indexOf("Win") >= 0)VBSMsg(text, 16 + ((msgModal) ? 0 : 4096), document.title);else alert(text);document.getElementById("text' + i + '").focus();return false;}}}}') eval('document.getElementById("text' + i + '").onkeypress = check' + i); document.getElementById("text1").focus(); i++; } </script> <script type="text/vbscript"> function VBSMsg(a, b, c) MsgBox a, b,c end function </script> </body> </html>
Bare hæv id'et på tekstfeltet, og funktionsnavnet i onkeypress med én for hvert nyt tekstfelt. Grunden til at det originale script er ændret så meget er, at hverken firefox eller netscape understøtter document.layers længere.
MEN ... Her har du et script med to variabler. En til komma og til punktum. Det skal bare kopires direkte ind; der er t aget højde for ekspertens margin
var p = false; //Accepter punktum: true - accepter ikke punktum: false var k = true; //Accepter komma: true - accepter ikke komma: false var msg = true; //Vis beskedboks ved ugyldige tal var msgModal = true; //Beskedboks applikationmodal: true - beskedboks systemmodal: false - virker kun på //Windows-platformen var negativeTal = true; //Accepter negative tal var text = "Ugyldigt tal."; //Meddelelsesboksens tekst
var i = 1; while(document.getElementById("text" + i)){ eval('function check' + i + '(e){if(navigator.userAgent.indexOf("Opera") < 0){use = (navigator.appName == "' + 'Microsoft Internet Explorer") ? window.event.keyCode : e.which;if(use == 0 || use == 8 || use == 13 || use' + '== 27 || (use == 44 && k) || (use == 45 && negativeTal) || (use == 46 && p)){}else if(use == 94 || use == ' + '96 || use == 126 || use == 168 || use ==180)return false;else if(use < 48 || use > 57){if(msg){if(navigato' + 'r.appName == "Microsoft Internet Explorer" && navigator.userAgent.indexOf("Win") >= 0)VBSMsg(text, 16 + ((' + 'msgModal) ? 0 : 4096), document.title);else alert(text);document.getElementById("text' + i + '").focus();r' + 'eturn false;}}}}') eval('document.getElementById("text' + i + '").onkeypress = check' + i); document.getElementById("text1").focus(); i++; } </script> <script type="text/vbscript"> function VBSMsg(a, b, c) MsgBox a, b,c end function </script> </body> </html>
I hendhold til Hallandsen-Soft A/S's kundeservicelov har bestyrelsen i samråd besluttet, for virkningen af scriptets skyld (for at scriptet virker, hvis msg er sat til false), at udstede følgende patch:
var p = false; //Accepter punktum: true - accepter ikke punktum: false var k = true; //Accepter komma: true - accepter ikke komma: false var msg = true; //Vis beskedboks ved ugyldige tal var msgModal = true; //Beskedboks applikationmodal: true - beskedboks systemmodal: false - virker kun på //Windows-platformen var negativeTal = true; //Accepter negative tal var text = "Ugyldigt tal."; //Meddelelsesboksens tekst
var i = 1; while(document.getElementById("text" + i)){ eval('function check' + i + '(e){if(navigator.userAgent.indexOf("Opera") < 0){use = (navigator.appName == "' + 'Microsoft Internet Explorer") ? window.event.keyCode : e.which;if(use == 0 || use == 8 || use == 13 || use' + '== 27 || (use == 44 && k) || (use == 45 && negativeTal) || (use == 46 && p)){}else if(use == 94 || use == ' + '96 || use == 126 || use == 168 || use ==180)return false;else if(use < 48 || use > 57){if(msg){if(navigato' + 'r.appName == "Microsoft Internet Explorer" && navigator.userAgent.indexOf("Win") >= 0)VBSMsg(text, 16 + ((' + 'msgModal) ? 0 : 4096), document.title);else alert(text);}document.getElementById("text' + i + '").focus();r' + 'eturn false;}}}') eval('document.getElementById("text' + i + '").onkeypress = check' + i); document.getElementById("text1").focus(); i++; } </script> <script type="text/vbscript"> function VBSMsg(a, b, c) MsgBox a, b,c end function </script> </body> </html>
Det er desværre ikke muligt at sende nogen paramtere med funktionen, da den første vil overtage parameteren "e", som bruges til at bestemme, hvilken tast, der er trykket på i Firefox og Netscape :~(.
Det passer imidlertid ikke helt. Her er den korrekte forklaring:
For at den parameter, som angiver, hvilken tast, der er trykket på bliver sendt, kræver det, at funktionen, der skal modtage den, bliver kaldt således:
[object].onkeypress = funktionsnavn;
altså uden brug at uden for det objekt, den skal benyttes på og uden paranteser.
Hvis man i stedet skriver event handleren i selve det objekt, den skal være tilknyttet til, sendes parameteren ikke. Gør man begge dele, og sender man desuden en parameter fra den event handler, som står inde objektet, sletter dette IKKE parameteren for tastetrykket, som skrevet tidligere. Derimod bliver den parameter, man selv har tilføjet aldrig sendt: Den kan altså ikke bruges til noget som helst. Bemærk at det kun er Firefox og Netscape, der sender sådan en parameter. Internet Explorer og Opera gør brug af window.event i stedet, og her kan man sagtens sende en parameter til funktionen. Det kan dog ikke anbefales, hvis den også skal bruges i andre browsere.
Grunden til, at event handleren i ovenstående script både står inde i og uden for tekstfeltet, hvor man nomalt kun gør en af delene er, at tastetrykparameteren som "sagt" kun sendes, hvis event handleren står uden for objektet, men hvis funktionen, der kaldes returner false og enent handleren, som kalder den ikke står inden for objeketet, ignorerer Netscape, at der er blevet returneret false. Derfor bliver event handleren også nødt til at stå inde i objeketet, i ovenstående script tekstfeltet, for at return false forhindrer et ugyldigt tal i at blive skrevet.
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.