代码之家  ›  专栏  ›  技术社区  ›  Ali

如何防止特殊字符在数字字段上复制粘贴

  •  1
  • Ali  · 技术社区  · 7 年前

    我只想复制粘贴数字在'数字字段'。如果我不阻止复制粘贴,我可以复制 'e','+','-' '.' 在数字字段中。在“数字”字段中,我可以键入这些字符,以便使用其他脚本。我只想键入和复制粘贴数字。

    请检查代码:

    jQuery("#otp_number").bind("cut copy paste", function(e) {
      e.preventDefault(); //prevent the default behaviour 
    });
    document.querySelector("#otp_number").addEventListener("keypress", function(evt) {
      if (evt.which != 8 && evt.which != 0 && evt.which < 48 || evt.which > 57) {
        evt.preventDefault();
      }
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    OTP: <input type="number" id="otp_number" data-ignorepaste="" />
    2 回复  |  直到 7 年前
        1
  •  3
  •   Carsten Massmann    7 年前
    jQuery("#otp_number").on("paste", function(e) {
      if (e.originalEvent.clipboardData.getData('text').match(/[^\d]/))
        e.preventDefault(); //prevent the default behaviour 
    })
    .on("keypress", function(e) {
      if (e.keyCode != 8 && e.keyCode != 0 && e.keyCode < 48 || e.keyCode > 57) 
         e.preventDefault();
    });
    

    您不需要限制复制或剪切操作。对粘贴事件应用测试就足够了。只有在剪贴板中找到要粘贴的非数字字符时,才会阻止此事件。

    我还没来得及测试这个,所以,请在必要时尝试改进。

    编辑:

    我很惊讶我最初的回答得到了如此多的正面反馈。不过,这里有一个替代版本,我相信这是一个有点宽容和用户友好。它允许首先输入任何可能的字符(每个输入或粘贴),并删除所有 非数值 之后的字符:

    jQuery("#otp_number").on("paste keyup",function(e){
       $(this).val(this.value.replace(/[^\d]/g,''))  
    })
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <input type="text" name="other" placeholder="anything"><br>
    <input type="text" id="otp_number" placeholder="numbers only">
        2
  •  1
  •   Kaiido    7 年前

    你想要的是在剪贴板的内容被添加到你的输入之前访问它。

    为此,您通常会查看 DataTransfer 正在沿着 ClipboardEvent .clipboardData属性。
    但是所有的浏览器都不支持这个功能,所以你还必须处理特殊的IE案例,它会在全局窗口对象上公开它。

    请注意,我必须修改一下onkeypress处理程序,这样它就不会阻止ctrl+v组合,但在IMO中,这个函数可能会受益于完全重构。。。

    jQuery("#otp_number").on("paste", function(e) {
      var dT = e.originalEvent.clipboardData || window.clipboardData;
      var text = dT.getData('text');
      if(parseInt(text) !== +text) { // allow only Ints
        e.preventDefault(); //prevent the default behaviour 
      }
    });
    
    // that one would probably need some refactoring...
    document.querySelector("#otp_number").addEventListener("keypress", function(evt) {
      if(!evt.ctrlKey && !evt.metaKey && // don't block ctrl + v
        evt.which != 8 && evt.which != 0 && (evt.which < 48 || evt.which > 57)) {
        evt.preventDefault();
      }
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    OTP: <input type="number" id="otp_number" data-ignorepaste="" />