Используйте этот DOM:
<input type = "text" onkeydown = "validate(event)"/>
И этот скрипт:
validate = function(evt)
{
if ([8, 46, 37, 39, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 35, 36].indexOf(evt.keyCode || evt.which) == -1)
{
evt.returnValue = false;
if(evt.preventDefault){evt.preventDefault();}
}
}
... ИЛИ этот скрипт без indexOf, использующий два for
's ...
validate = function(evt)
{
var CharValidate = new Array("08", "046", "039", "948", "235");
var number_pressed = false;
for (i = 0; i < 5; i++)
{
for (Ncount = 0; Ncount < parseInt(CharValidate[i].substring(0, 1)) + 1; Ncount++)
{
if ((evt.keyCode || evt.which) == parseInt(CharValidate[i].substring(1, CharValidate[i].lenght)) + Ncount)
{
number_pressed = true;
}
}
}
if (number_pressed == false)
{
evt.returnValue = false;
if(evt.preventDefault){evt.preventDefault();}
}
}
Я использовал атрибут onkeydown вместо onkeypress, потому что атрибут onkeydown проверяется перед атрибутом onkeypress. Проблема будет в браузере Google Chrome.
С атрибутом «onkeypress» TAB будет неуправляемым с «protectDefault» в Google Chrome, однако с атрибутом «onkeydown» TAB станет управляемым!
Код ASCII для TAB => 9
Первый скрипт имеет меньше кода, чем второй, однако в массиве символов ASCII должны быть все ключи.
Второй скрипт намного больше первого, но массиву не нужны все ключи. Первая цифра в каждой позиции массива - это количество раз, которое будет прочитана каждая позиция. Для каждого чтения будет увеличен 1 до следующего. Например:
NCount = 0
48 + NCount = 48
NCount + +
48 + NCount = 49
NCount + +
...
48 + NCount = 57
В случае числовых ключей только 10 (0 - 9), но если бы они были 1 миллионом, не имело бы смысла создавать массив со всеми этими ключами.
ASCII коды:
- 8 ==> (Backspace);
- 46 => (Удалить);
- 37 => (стрелка влево);
- 39 => (стрелка вправо);
- 48 - 57 => (цифры);
- 36 => (дома);
- 35 => (конец);