2015-08-18 3 views
1


Я пытаюсь REGEX поля ввода в JavaScript Что я делаю, eveytime клавиша нажата, следующий код вызываются:.

function testPattern(pattern, evt) { 
    // in this case, pattern = "^[0-9]*$" 
    var inputField = evt.getCurrentTarget(); 
    var keyCode = evt.getKeyCode(); 
    var oldValue = inputField.getSubmittedValue(); 

    // return if keycode is navigation, delete or backspace 
    if((keyCode >= 35 && keyCode <= 40) || keyCode == 8 || keyCode == 46){ 
     return; 
    } 

    var regExp = new RegExp(pattern); 
    var hasMatch = false; 

    hasMatch = regExp.test(String.fromCharCode(keyCode)); 

    if (!hasMatch) { 
     inputField.setValue(oldValue); 
     evt.cancel(); 
    } 
} 

ожидаемый результат:. символ не записывается во входном текстовом поле, если вход отличается от цифры это работает отлично, за исключением знаков, за исключением # $% & и (
Я пробовал следовать ING регулярное выражение (очень похожий)

"^[\\d]$" 
"^[\\d]*$" 
"^[\\d]+$" 
"^[0-9]*$" 

Кто-то знает, почему это может происходить?

ответ

2

Там нет ничего плохого с регулярными выражениями.

Проблема заключается в

// return if keycode is navigation, delete or backspace 
if((keyCode >= 35 && keyCode <= 40) || keyCode == 8 || keyCode == 46) 
    return; 

Если вы посмотрите на таблицу ASCII, вы увидите, что:

8  backspace 
35 # 
36 $ 
37 % 
38 & 
39 ´ 
40 (
46 . 

Ваша проблема возникает из-за путаницы между KEYCODE и charCode в браузере реализации/клавиатура, которую вы слушаете:

Этот вопрос может быть полезным: keycode and charcode

+0

Это должно было игнорировать навигацию по стрелкам и удаление символов. Я думал, что это будет Char Codes http://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes. Большое вам спасибо за вашу помощь! :) – MariBarcelos

0

использовать регулярное выражение таким образом:

/^\d+$/ 
+0

Это все еще происходит. Это ведет себя точно так же, как и те, которые я использовал. Я думаю, что это действительно странное поведение. – MariBarcelos

0

Ограничьте этот ASCII 35,36,37,38,39,40, чтобы ограничить эти символы, или вы можете использовать приведенный ниже код.

<script type="text/javascript"> 

    var specialKeys = new Array(); 
    specialKeys.push(8); //Backspace 
    specialKeys.push(9); //Tab 
    specialKeys.push(46); //Delete 
    specialKeys.push(36); //Home 
    specialKeys.push(35); //End 
    specialKeys.push(37); //Left 
    specialKeys.push(39); //Right 

    function IsAlphaNumeric(e) { 
     var keyCode = e.keyCode == 0 ? e.charCode : e.keyCode; 
     var ret = ((keyCode >= 32 && keyCode <= 32)||(keyCode >= 44 && keyCode <= 44)||(keyCode >= 46 && keyCode <= 46)||(keyCode >= 48 && keyCode <= 57) || (keyCode >= 65 && keyCode <= 90) || (keyCode >= 97 && keyCode <= 122) || (specialKeys.indexOf(e.keyCode) != -1 && e.charCode != e.keyCode)); 
     document.getElementById("error").style.display = ret ? "none" : "inline"; 
     return ret; 
    } 
</script> 
Смежные вопросы