只允许数字和ctrl + a,ctrl + v,ctrl + c到文本框

问题描述:


我试图让用户只输入数字并将控件复制并粘贴到文本框。我能够限制用户只输入数字,但复制,粘贴不工作,我帮我解决这个问题。

这里是我的脚本:
只允许数字和ctrl + a,ctrl + v,ctrl + c到文本框

$(".allow_only_numbers").keydown(function (e) { 
    var ctrlDown = false; 
    var ctrlKey = 17, vKey = 86, cKey = 67; 
    if (e.keyCode === ctrlKey){ 
     ctrlDown = true; 
    } 
    // Allow: backspace, delete, tab, escape, enter and . 
    if ($.inArray(e.keyCode, [46, 8, 9, 27, 13, 110]) !== -1 || 
      // Allow: Ctrl 
     (e.keyCode === ctrlKey) || 
      // Allow: Ctrl+A 
     (e.keyCode === 65 && e.ctrlKey === true) || 
      // Allow: Ctrl+v 
     (e.keyCode === vKey && ctrlDown) || 
      // Allow: Ctrl+c 
     (e.keyCode === cKey && ctrlDown) || 
      // Allow: home, end, left, right, down, up 
     (e.keyCode >= 35 && e.keyCode <= 40)) { 
     // let it happen, don't do anything 
     return; 
    } 
    // Ensure that it is a number and stop the keypress 
    if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) { 
     e.preventDefault(); 
    } 
}); 

这里是的jsfiddle链接:

https://jsfiddle.net/sureshpattu/stwzhceL/1/

+0

你能不能只设置类型为数字? ''? – guradio

+0

@Pekka我可以限制用户只输入数字,但复制,粘贴不适合我。现代浏览器的 –

+0

可以使用'input'事件进行粘贴和按键事件。 IE9有部分支持,IE8没有 – charlietfl

尝试用event.keyCodeevent.metaKey这样。

$(document).ready(function() { 
 
    $(".allow_only_numbers").keydown(function(e) { 
 
    // Allow: backspace, delete, tab, escape, enter and . 
 
    if ($.inArray(e.keyCode, [46, 8, 9, 27, 13, 110, 190]) !== -1 || 
 
     // Allow: Ctrl+A,Ctrl+C,Ctrl+V, Command+A 
 
     ((e.keyCode == 65 || e.keyCode == 86 || e.keyCode == 67) && (e.ctrlKey === true || e.metaKey === true)) || 
 
     // Allow: home, end, left, right, down, up 
 
     (e.keyCode >= 35 && e.keyCode <= 40)) { 
 
     // let it happen, don't do anything 
 
     return; 
 
    } 
 
    // Ensure that it is a number and stop the keypress 
 
    if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) { 
 
     e.preventDefault(); 
 
    } 
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> 
 
<input type="number" class="allow_only_numbers" />

编辑:

从您的代码删除下面的代码片段。

var ctrlDown = false; 
var ctrlKey = 17, vKey = 86, cKey = 67; 
if (e.keyCode === ctrlKey) { 
    ctrlDown = true; 
} 

因为ctrlDownfalse同时按下CV用于复制和粘贴。因此,您的ctr+cctrl+v不起作用。

如果您改变​​事件到keyup事件,您可以使用e.ctrlKey,这将是true当按下ctrl键时。

function numbersonly(evt) { 
    evt = (evt) ? evt : window.event; 
    var charCode = (evt.which) ? evt.which : evt.keyCode; 
    if (charCode > 31 && (charCode < 48 || charCode > 57)) { 
     return false; 
    } 
    return true; 
} 

$(".allow_only_numbers").keydown(function (e) { 
     var isModifierkeyPressed = (e.metaKey || e.ctrlKey || e.shiftKey); 
     var isCursorMoveOrDeleteAction = ([46,8,37,38,39,40].indexOf(e.keyCode) != -1); 
     var isNumKeyPressed = (e.keyCode >= 48 && e.keyCode <= 58) || (e.keyCode >=96 && e.keyCode <= 105); 
     var vKey = 86, cKey = 67,aKey = 65; 
     switch(true){ 
      case isCursorMoveOrDeleteAction: 
      case isModifierkeyPressed == false && isNumKeyPressed: 
      case (e.metaKey || e.ctrlKey) && ([vKey,cKey,aKey].indexOf(e.keyCode) != -1): 
       break; 
      default: 
       e.preventDefault(); 
     } 
}); 

这里工作示例

https://jsfiddle.net/stwzhceL/8/

这让你ctrl+actrl+cctrl+v以及方向键,删除键,退格键。

加上这段代码覆盖MAC为好。(这是cmd+a/cmd+c/cmd+v

+0

好的解决方案,比约翰R.的答案更清晰,即使它本质上是相同的东西 – rkd

这应该给你一个想法。对不起,我在Mac上,据我所知e.ctrlKey等不适用于Mac。

var mod; 
 

 
var ouput = jQuery('#output'); 
 

 

 
var numeric = jQuery('#numeric').keydown(function(e){ 
 
    mod = e.which; 
 
    
 
    if(!(e.which >= 48 && e.which <= 57) && (e.which != 8) 
 
    && (mod && (e.which == 67 || e.which != 86))){ 
 
     e.preventDefault(); 
 
    } 
 
    
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type='text' id='numeric'/> 
 

 
<label id='output'></label>

$(".allow_only_numbers").on("input",function (e) { 
 
    e.target.value = e.target.value.replace(/[^0-9]/g,'') 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="text" class="allow_only_numbers" />