2012-08-12 54 views
0

我試圖讓它阻止任何非數字和輸入值長度不大於6的輸入。現在它的工作原理是阻止任何超過6個字符,如果輸入包含alpha。但是,如果我更改爲阻止,如果它是字母或大於6個字符,我什麼都不能輸入。有什麼想法嗎?AND和OR運算符,正則表達式和值長度

<script type="text/javascript"> 
    $(document).ready(function() { 
     var pattern = /^[0-9]+$/; 
     $('#input1,#input2').keypress(function (e) { 
      var length = this.value.length; 
      if (!pattern.test($(this).val()) && (length >= 6)) { 
       e.preventDefault(); 
      } 
     }); 
    }); 
</script> 

回答

2

我相信這個問題是在你製作的您正則表達式,按下不會在$(this).val()顯示的第一個字母,直到該函數結束後的方式(這就是爲什麼你仍然可以使用e.preventDefault(); );這意味着正則表達式正在測試的val是正則表達式不匹配的空白。

我建議你在當前值附加下一個字符,這樣你可以測試字符串將是,而不是它是什麼。

喜歡的東西:

$(document).ready(function() { 
    var pattern = /^[0-9]+$/; 
    $('#input1,#input2').keypress(function (e) { 
    var curVal = $(this).val() + String.fromCharCode(e.charCode); 
    var length = curVal.length; 

    if (length > 6 || !pattern.test(curVal)) { 
     e.preventDefault(); 
    } 
    }); 
}); 

這裏的codepen。 codepen會做一些不同的事情,因爲有更好的方法可以做到這一點,然後使用昂貴的正則表達式(這一直不重要,但我喜歡優化)。

3

補充什麼mazzzzz說,你可以測試你想要一個更強大的模式:

var pattern = /^\d{1,6}$/; 

這隻會有1到6個字符接收數字(\ d)。

+0

謝謝你的提示 – 2012-08-12 06:01:57

+0

@ZacharySheldon:歡迎您! – davidbuzatto 2012-08-12 15:14:50

0

似乎你根本不需要正則表達式。

<input type="text" id="input1" /> 
<input type="text" id="input2" /> 

<script type="text/javascript"> 
    var maxLen = 6, 
     helpCodes = [37, 39, 8, 9], // left and right arrows, backspace, tab 
     codes = []; 
    for(var code = 48; code < 58; code++) { // number keys (48-57) 
     codes.push(code); 
    } 
    $('#input1,#input2').on('keydown', function (e) { 
     if(helpCodes.indexOf(e.keyCode) > -1) { 
      return true; 
     } 
     if(e.shiftKey || this.value.length == maxLen 
       || codes.indexOf(e.keyCode) < 0) { 
      return false; 
     } 
    }); 
</script>​ 

DEMO