Avatar billede renewester Nybegynder
02. december 2005 - 08:50 Der 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?

-----
ns4 = (document.layers)? true:false;
ie4 = (document.all)? true:false;

function kp(talvar) {
  if (ns4) {if (talvar.which==13 || talvar.which==9) { /*ok*/ }
            else if (talvar.which<48 || talvar.which>57) {alert('Type only numbers!');}
          }
  if (ie4) {talvar=window.event; if (talvar.keyCode==13 || talvar.keyCode==9) { /*ok*/ }
            else if (talvar.keyCode<48 || talvar.keyCode>57) {alert('Type only numbers!');
            talvar.cancelBubble=true;talvar.keyCode=0;}
              }
}
Avatar billede hr__hallandsen Nybegynder
02. december 2005 - 16:06 #1
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


function check(){
    if(navigator.appName == "Microsoft Internet Explorer" && navigator.userAgent.indexOf("Opera") < 0){
        if(window.event.keyCode == 13 || window.event.keyCode == 27 || (window.event.keyCode == 44 && !pk) || (window.event.keyCode == 45 && negativeTal) || (window.event.keyCode == 46 && pk)){}
        else if(window.event.keyCode < 48 || window.event.keyCode > 57)
            if(msg){
                window.event.keyCode = 0;
                VBSMsg(text, 16 + ((msgModal) ? 0 : 4096), document.title);
            }
    }
}
</script>
</head>
<body>
<input type="text" onkeypress="check();">
<script type="text/vbscript">
function VBSMsg(a, b, c)
MsgBox a, b,c
end function
</script>
</body>
</html>

hilsen hallandsen
Avatar billede roenving Novice
03. december 2005 - 03:32 #2
Vrøvl, der er ingen problemer i at detektere fejl-indtastninger i enhver browser ...

-- vender tilbage, når Eksperten er på banen igen !-)
Avatar billede hr__hallandsen Nybegynder
03. december 2005 - 12:24 #3
>>roenving

Det du skriver er kun delvist rigtigt. Nedenstående beskriver, hvorfor andre browsere end IE ikke kan bruges, hvis scriptet skal virke optalt.

Opera returnerer ved tryk på en af de tolv F-taster (F1-F12) elleve af gangene samme keyCode
Avatar billede hr__hallandsen Nybegynder
03. december 2005 - 13:26 #4
Pokkers! Ramte "Send" ved en fejl. Fortsætter:

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>

--------------------------------------------------------------------------------

Hilsen Hallandsen, korrupt bagmand og x-xpert
Avatar billede hr__hallandsen Nybegynder
03. december 2005 - 15:04 #5
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.

HallandsenSoft A/S
Avatar billede renewester Nybegynder
04. december 2005 - 21:51 #6
Hej Hallandsen.

Tak for dine input.

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?

Kan man udvide det, så man også må taste punktum?

På forhånd tusinde tak :-)
Avatar billede hr__hallandsen Nybegynder
05. december 2005 - 20:51 #7
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:

var pk = false;  //Accepter punktum: true - accepter komma: false
Avatar billede hr__hallandsen Nybegynder
05. december 2005 - 20:52 #8
og

ændr linien

    if(use == 0 || use == 8 || use == 13 || use == 27 || (use == 44 && !pk) || (use == 45 && negativeTal) || (use == 46 && pk)){}

til

    if(use == 0 || use == 8 || use == 13 || use == 27 || (use == 44) || (use == 45 && negativeTal) || (use == 46)){}
Avatar billede renewester Nybegynder
05. december 2005 - 20:58 #9
Hej Hallandsen
Ok, tak :-)

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...
Avatar billede hr__hallandsen Nybegynder
06. december 2005 - 10:00 #10
Jow da:

----------------------------------------------------------------------------------

<html>
<head>
<title>Gyldigt tal eller ej?</title>
</head>
<body>
<input type="text" id="text1" onkeypress="check1();">
<input type="text" id="text2" onkeypress="check2();">
<input type="text" id="text3" onkeypress="check3();">
<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

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.
Avatar billede hr__hallandsen Nybegynder
06. december 2005 - 10:02 #11
Ps: linien som starter med

eval('function check' + i + '(e){if(navigator.userAgent.indexOf("Opera") < 0){use = (navigator.appName == "Microsoft

og slutter med

alert(text);document.getElementById("text' + i + '").focus();return false;}}}}')

er én lang linie.

det samme gælder for

var msgModal = true;  //Beskedboks applikationmodal: true - beskedboks systemmodal: false - virker kun på Windows-platformen
Avatar billede renewester Nybegynder
06. december 2005 - 10:15 #12
Hej Hallandsen
Det fungerer fint med tal og komma, men ikke med punktum.
Jeg takker mange gange for hjælpen :-)
Avatar billede hr__hallandsen Nybegynder
06. december 2005 - 17:39 #13
Hentyder du til det nyeste script skal linien

var pk = false;  //Accepter punktum: true - accepter komma: false

erstattes med

var pk = true;  //Accepter punktum: true - accepter komma: false

for at acceptere punktum i stedet for komma.

Skal begge dele accepteres skal linien slettes og

(use == 45 && negativeTal) || (use == 46 && pk)

skal ændres til

(use == 45) || (use == 46)
Avatar billede hr__hallandsen Nybegynder
06. december 2005 - 17:50 #14
FEJL FEJL FEJL

Det er ikke

(use == 45 && negativeTal) || (use == 46 && pk)

som skal ændres, men derimod

(use == 44 && !pk) || (use == 45 && negativeTal) || (use == 46 && pk)

som skal ændres til

(use == 44) || (use == 45 && negativeTal) || (use == 46)

Jeg beklager :-(
Avatar billede hr__hallandsen Nybegynder
06. december 2005 - 17:52 #15
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

----------------------------------------------------------------------------------

<html>
<head>
<title>Gyldigt tal eller ej?</title>
</head>
<body>
<input type="text" id="text1" onkeypress="check1();">
<input type="text" id="text2" onkeypress="check2();">
<input type="text" id="text3" onkeypress="check3();">
<script type="text/javascript">


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 var så le script ultimativos

Hallandsen
Avatar billede renewester Nybegynder
06. december 2005 - 21:13 #16
Så kører det... Tusinde tak :-)
Avatar billede hr__hallandsen Nybegynder
08. december 2005 - 11:58 #17
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:

-------------------------------------------------------------------
<html>
<head>
<title>Gyldigt tal eller ej?</title>
</head>
<body>
<input type="text" id="text1" onkeypress="check1();">
<input type="text" id="text2" onkeypress="check2();">
<input type="text" id="text3" onkeypress="check3();">
<script type="text/javascript">


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>

-------------------------------------------------------------------

HallandsenSoft A/S
Avatar billede hr__hallandsen Nybegynder
08. december 2005 - 14:24 #18
Jeg har før skrevet at

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.
Avatar billede hr__hallandsen Nybegynder
08. december 2005 - 15:00 #19
Nå, har lige fået at vide, det er at foretrække at frem for, så jeg må jo nok hellere skrive, at de første syv linier i while-lykken bør erstattes af

----------------------------------------------------------------------------

  eval('function check' + i + '(e){if(navigator.userAgent.indexOf("Opera") < 0){use = (window.event.keyCode) ' +
  '? 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 == 16' +
  '8|| use ==180)return false;else if(use < 48 || use > 57){if(msg){if(navigator.appName == "Microsoft Intern' +
  'et Explorer" && navigator.userAgent.indexOf("Win") >= 0)VBSMsg(text, 16 + ((msgModal) ? 0 : 4096), documen' +
  't.title);else alert(text);}document.getElementById("text' + i + '").focus();return false;}}}');
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