2013年1月14日 星期一

使用 javascript 限制 input 只能輸入數字

方法一:(簡單但缺點是非數字的字元,會顯示後在消失。按著不放時,則最後再過濾消失。)
<input type="text" name="aa" onkeyup="this.value=this.value.replace(/[^\d]/g,'')" />


方法二:
<script>
function my_key(e){
    var key;
    if(window.event) {
        key = e.keyCode;
    }else if(e.which) {
        key = e.which;
    } else {
        return true;
    }
    if(8==key || 46==key){//8:backspace 46:delete (倒退鍵和刪除鍵也允許作用)
        return true;
    }
    var keychar = String.fromCharCode(key);
    var reg = /\d/;
    return reg.test(keychar);
}
  </script>
<input type="text" name="bb" value="" onkeypress="return my_key(event)">
<input type="text" name="cc" value="" onkeydown="return my_key(event)">
此方法可以選用onkeypress或onkeydown,兩者有一點不一樣,
例如:上、下、左、右,onkeydown才會偵測的到。(參考 JavaScript Madness: Keyboard Events)


方法三:
後來發現前面方法二,如果用右邊的數字鍵盤會怪怪的,
用onkeypress偵測「. Del」這個鍵,不管是不是「num lock」的code都同樣是「46」,
所以如果如果不想允許輸入「.」,便要另外想辦法判斷是否為「num lock」。
用onkeydown偵測數字鍵盤上的數字code,範圍為96~105,用String.fromCharCode轉換回來,變成不是數字。

所以另外修改了使用onkeydown且只能輸數0~9數字的方式。
<script>
function my_key_down(e){
    var key;
    if(window.event) {
        key = e.keyCode;
    }else if(e.which) {
        key = e.which;
    } else {
        return true;
    }
    if( (key>=48 && key<=57)
        || (key>=96 && key<=105) //數字鍵盤
        || 8==key || 46==key || 37==key || 39==key //8:backspace 46:delete 37:左 39:右 (倒退鍵、刪除鍵、左、右鍵也允許作用)
        ){
        return true;
    }else{
        return false;
    }
}
</script>
onkeydown:<input type="text" name="dd" value="" onkeydown="return my_key_down(event)">


※註:在Firefox上,用新注音輸入法,再按數字鍵盤,方法二、方法三似乎就沒用了。
所以為了最後選擇了同時使用onkeyup和onkeydown
<script>
function my_key_down(e){
    var key;
    //console.warn(e.keyCode);
    //console.warn(e.which);
    if(window.event) {
        key = e.keyCode;
    }else if(e.which) {
        key = e.which;
    } else {
        return true;
    }
    //console.log(key);
    if( (key>=48 && key<=57)
        || (key>=96 && key<=105) //數字鍵盤
        || 8==key || 46==key || 37==key || 39==key //8:backspace 46:delete 37:左 39:右 (倒退鍵、刪除鍵、左、右鍵也允許作用)
        ){
        return true;
    }else{
        return false;
    }
}
//console.log(String.fromCharCode(229));
//console.log(String.fromCharCode(0));
</script>
onkeyup:<input type="text" name="aa" onkeyup="this.value=this.value.replace(/[^\d]/g,'')">
<br>
onkeydown:<input type="text" name="dd" value="" onkeydown="return my_key_down(event)">
<br> 
onkeyup+onkeydown:<input type="text" name="aa" onkeyup="this.value=this.value.replace(/[^\d]/g,'')" onkeydown="return my_key_down(event)">

沒有留言:

張貼留言