3

在我的项目中,我的文本字段仅采用数值。但是当我使用 ctl+c 复制字母并使用 ctl+v 粘贴时,它将允许文本字段中的字母。所以我使用以下命令禁用复制和粘贴代码。

$('input').bind('copy paste', function(e) {
 e.preventDefault();
});

但我只想阻止字母。这意味着我想要复制粘贴数值而不是字母。

4

6 回答 6

6

试试这个功能。这可能不是你想要的,但你可以做一些事情。我之前做过这个并发布在我的博客上。

JS:

 $(function(){  
                $(".numericOnly").bind('keypress',function(e){  
                          if(e.keyCode == '9' || e.keyCode == '16'){  
                                return;  
                           }  
                           var code;  
                           if (e.keyCode) code = e.keyCode;  
                           else if (e.which) code = e.which;   
                           if(e.which == 46)  
                                return false;  
                           if (code == 8 || code == 46)  
                                return true;  
                           if (code < 48 || code > 57)  
                                return false;  
                     }  
                );  
                $(".numericOnly").bind("paste",function(e) {  
                     e.preventDefault();  
                });  
                $(".numericOnly").bind('mouseenter',function(e){  
                      var val = $(this).val();  
                      if (val!='0'){  
                           val=val.replace(/[^0-9]+/g, "")  
                           $(this).val(val);  
                      }  
                });  
           });  

HTML:

 <body>  
       <input type="text" id="textBox" class="numericOnly" />  
 </body>  

这将允许您仅输入数值。你甚至不能复制粘贴和拖放。

演示

代码链接

于 2012-10-12T10:04:35.167 回答
3

在查看了事件对象和“duckduckgoing”之后:

$('input').on('paste', function (event) {
    if (event.originalEvent.clipboardData.getData('Text').match(/[^\d]/)) {
        event.preventDefault();
    }
});

我不知道这是如何跨浏览器的,但如果向后兼容性没有问题,请继续使用它。

codepen上查看

PS:我在 mac os 10.6 上使用 google chrome 版本 22

编辑:firefox 13 没有 clipboardData 对象,即 10 也没有,safari 5.1.2 支持它(所以它是一个 webkit 功能)。

于 2012-10-12T10:45:22.277 回答
1

此函数适用于 jQuery。它只允许数字文本框代码:

jQuery.fn.filter = function() {
    $(this).keydown(function (e) {
        if (e.shiftKey || e.ctrlKey || e.altKey) { // if shift, ctrl or alt keys held down
            e.preventDefault();         // Prevent character input
        } else {
            var n = e.keyCode;
            if (!((n == 8)              // backspace
            || (n == 46)                // delete
            || (n >= 35 && n <= 40)     // arrow keys/home/end
            || (n >= 48 && n <= 57)     // numbers on keyboard
            || (n >= 96 && n <= 105))   // number on keypad
            ) {
                e.preventDefault();     // Prevent character input
            }
        }
  $(document).mousedown(function(e){ 
    if( e.button == 2 ) { 
      e.preventDefault();         // Prevent character input
        } else {
            var n = e.keyCode;
            if (!((n == 8)              // backspace
            || (n == 46)                // delete
            || (n >= 35 && n <= 40)     // arrow keys/home/end
            || (n >= 48 && n <= 57)     // numbers on keyboard
            || (n >= 96 && n <= 105))   // number on keypad
            ) {
                e.preventDefault();    
            }
    }
    });
}

我不确定你的适当需求,但试试这个。对不起,如果它不是你想要的。

于 2012-10-12T09:10:02.007 回答
1

对于您的问题,我有一个有趣的解决方法。对于paste事件,您可以使用以下代码:

$("input").on("paste", function(e) {
    var that = this;
    that.style.color = "#fff";      // field background color
    setTimeout(function() {
        that.value = that.value.replace(/\D/g, "");
        that.style.color = "#000";  // normal field font color
    }, 100);
});​

演示:http: //jsfiddle.net/dgWDX/

于 2012-10-12T09:34:17.847 回答
1

jaychapani 提供的解决方案几乎适用于该用户的特定问题。但是,它可以防止粘贴任何内容,甚至是数字。

我稍微修改了代码,现在 Javascript (a) 允许用户粘贴数字,但 (b) 不允许使用字母和特殊字符。我从上面的 jaychapani 示例中删除了以下内容:

            $(".numericOnly").bind("paste",function(e) {  
                 e.preventDefault();  
            });  

最终代码将是:

            $(function(){  
            $(".numericOnly").bind('keypress',function(e){  
                      if(e.keyCode == '9' || e.keyCode == '16'){  
                            return;  
                       }  
                       var code;  
                       if (e.keyCode) code = e.keyCode;  
                       else if (e.which) code = e.which;   
                       if(e.which == 46)  
                            return false;  
                       if (code == 8 || code == 46)  
                            return true;  
                       if (code < 48 || code > 57)  
                            return false;  
                 }  
            );  

            $(".numericOnly").bind('mouseenter',function(e){  
                  var val = $(this).val();  
                  if (val!='0'){  
                       val=val.replace(/[^0-9]+/g, "")  
                       $(this).val(val);  
                  }  
            });  
       });  

这有效,并且在使用 Ctl+v 或从菜单粘贴时会拒绝字母和特殊字符。但是,我注意到,有时在用户粘贴不需要的字符之后,表单拒绝它们之前会有一段时间的延迟。

通常,拒绝不需要的字符会在一两秒后发生。但是在少数情况下,文本被清除之前的等待时间大约为 10 秒。我猜这是因为(a)我正在刷新观察行为并且一些奇怪的缓存行为导致 Javascript 快速工作的延迟或(b)Javascript 的一些循环问题或(c)一些组合两个都。

不过,这在大多数生产环境中都可以正常工作。我怀疑用户在提交之前会一遍又一遍地刷新页面。

但是,我想知道是否有更优化的解决方案。欢迎提出改进这一点的建议。

于 2013-03-26T18:34:20.103 回答
0

我已经更新了 jaychapani 的答案。在这里,我添加了对箭头键的支持。并防止% & (按键。

    $("input").bind('keypress', function (e) {
    if (e.keyCode == '9' || e.keyCode == '16') {
        return;
    }
    var code;
    if (e.keyCode) code = e.keyCode;
    else if (e.which) code = e.which;
    if (e.which == 46)
        return false;
    if (e.which == 33 || e.which == 64 || e.which == 35 || e.which == 36 || e.which == 37 || e.which == 94 || e.which == 38 || e.which == 42 || e.which == 40 || e.which == 41)
        return false;
    if (code == 8 || code == 46)
        return true;
    if (code == 37 || code == 38 || code == 39 || code == 40)
        return true;
    if (code < 48 || code > 57)
        return false;
});


$("input").bind("paste", function (e) {
    e.preventDefault();
});
$("input").bind('mouseenter', function (e) {
    var val = $(this).val();
    if (val != '0') {
        val = val.replace(/[^0-9]+/g, "")
        $(this).val(val);
    }
});

JSFiddle 演示

谢谢你。

于 2018-05-24T22:28:55.333 回答