Ja da! :)
Man kan f.eks. reagere på onkeydown og kalde en handler som sorterer de anslag fra som ikke falder indenfor de regler du sætter op (event.returnValue = false for dem der ikke skal medtages, såvidt jeg husker).
Du skal nok også filtrere på andre events (så som onpaste), da der kan komme data i feltet via andre metoder end tastatur...
Jeg har flg. formular:
<html>
<head>
<title>Test af inputvalidering</title>
<script language="javascript" src="fieldvalidate.js"></script>
<script language="javascript">
function initInput()
{
for(var i = 0; i < document.forms[0].elements.length; i++)
{
var elm = document.forms[0].elements[i];
if(elm.className == "numinput" || elm.className == "floatinput")
{
elm.onkeydown = ensureNumeric;
elm.onblur = formatNumeric;
}
}
var defCtl = document.forms[0].txtColumns
if(defCtl)
{
defCtl.focus();
defCtl.select();
}
}
</script>
</head>
<body onload="initInput()">
<form>
<table>
<tr>
<td class="labelcell"><label for="txtColumns">kommatal:</label></td>
<td class="inputcell"><input type="text" class="floatinput" value="4" minvalue="1" ID="txtColumns" NAME="txtColumns"/></td>
</tr>
<tr>
<td class="labelcell"><label for="txtRows">heltal:</label></td>
<td class="inputcell"><input type="text" class="numinput" value="3" minvalue="1" ID="txtRows" NAME="txtRows"/></td>
</tr>
</table>
</form>
</body>
</html>
og mit fieldvalidate-script ser således ud:
// ============================================================
// Sørger for at indholdet i et felt er numerisk.
// Feltet skal være af klassen floatinput eller numinput.
// floatinput tillader 0 eller 1 komma og tal.
// numinput tillader kun tal og altså ikke komma.
// ============================================================
function ensureNumeric()
{
function isAllowed(ord, allows)
{
var bRes = false;
bRes = allows.indexOf("," + ord + ",") > -1;
return bRes;
}
var elm = event.srcElement;
var ord = event.keyCode;
var allowed = ",8,9,35,36,37,38,39,40,46,48,49,50,51,52,53,54,55,56,57,96,97,98,99,100,101,102,103,104,105,";
if(elm.className == "floatinput" && elm.value.indexOf(",") < 0)
allowed += "110,188,";
if(!isAllowed(ord, allowed))
{
event.returnValue = false;
}
window.status = ord;
}
// ============================================================
// Formatterer indholdet af et numerisk felt, så det sikres at
// tal indtastet er valide heltal eller kommatal.
// Hvis der på input-feltet er defineret en attribut som hedder
// "minvalue" kan feltets værdi ikke være mindre end denne.
// ============================================================
function formatNumeric()
{
var elm = event.srcElement;
if(elm)
{
var minval = elm.getAttribute("minvalue") + "";
var v = parseFloat("0" + elm.value.replace(",","."));
if(minval != "")
if(v < minval)
v = parseFloat(minval);
elm.value = v.toString().replace(".",",");
}
}