【问题标题】:Allow only numbers and ctrl+a , ctrl+v , ctrl+c to a textbox只允许数字和 ctrl+a , ctrl+v , ctrl+c 到文本框
【发布时间】:2016-01-19 23:06:13
【问题描述】:


我试图让用户只输入数字并将控件复制并粘贴到文本框中。我可以限制用户仅输入数字,但复制、粘贴对我不起作用帮助我解决此问题。

这是我的脚本:

$(".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/

【问题讨论】:

  • 你不能只将类型设置为数字吗? &lt;input type="number" name="quantity" min="1" max="5"&gt;?
  • @Pekka 我可以限制用户只输入数字,但复制、粘贴对我不起作用。
  • 对于现代浏览器可以使用input 事件进行粘贴和按键事件。 IE9 部分支持,IE8 不支持
  • @SureshPattu 你试过我的答案了吗?
  • @JohnR 是的,我试过了,非常感谢 :)

标签: javascript jquery regex keycode


【解决方案1】:

像这样尝试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" />

编辑:

从您的代码中删除以下代码 sn-ps。

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

因为ctrlDown 将是false,同时按CV 进行复制和粘贴。因此,您的 ctr+cctrl+v 无法正常工作。

【讨论】:

    【解决方案2】:

    $(".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" />

    【讨论】:

    • 被低估了。无需将一堆键码和 ctrl 键组合列入白名单的清洁解决方案。谢谢。
    • 我没有准备好用 IE8 进行验证,但是有一个 SO 回答说你可以使用 on('propertychange input') 而不仅仅是 on('input') stackoverflow.com/questions/19160902/…
    • 迄今为止我找到的最佳解决方案! +1
    【解决方案3】:
    $(".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

    【讨论】:

    • 很好的解决方法,比 John R. 的答案更清晰,即使它本质上是一样的
    【解决方案4】:

    来自@Shaanimal 的回答。 这是我的角度 js 指令。仅使用数字输入。

    .directive('onlyNumber', function() {
            return  {
                restrict: 'A',
                link: function (scope, elm, attrs, ctrl) {
                    elm.on("propertychange input",function (event) {
                        event.target.value = event.target.value.replace(/[^0-9]/g,'');
                    });
                }
            };
        })
    

    只需对您的元素使用“唯一编号”即可。 示例:

    <input type="text" data-ng-model="number" placeholder="number"id="cifNumber" only-number/>
    

    【讨论】:

    • 感谢您的提及。
    【解决方案5】:
    $('.numericOnly').on('keydown keyup', 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();
        }
        //Ensure that bulk number pasted is numeric only
        let n = $(this).val()
        if (!isNaN(parseFloat(n)) && isFinite(n)) {
        } else {
            $(this).val("")
        }
    })
    

    【讨论】:

      【解决方案6】:

      如果您将keydown 事件更改为keyup 事件,则可以使用e.ctrlKey,当按下ctrl 键时,它将是true

      【讨论】:

        【解决方案7】:
        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;
        }
        

        【讨论】:

          【解决方案8】:

          这应该会给你一个想法。抱歉,我在 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>

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-06-04
            • 1970-01-01
            • 2015-01-10
            • 1970-01-01
            • 1970-01-01
            • 2012-08-29
            • 2021-12-06
            • 1970-01-01
            相关资源
            最近更新 更多