【问题标题】:JavaScript to only allow numbers and certain length and no periodsJavaScript 只允许数字和一定的长度,没有句点
【发布时间】:2018-07-24 17:51:32
【问题描述】:

我需要一段 JavaScript 方面的帮助。我有这个代码:

<script>
function FilterInput(event) {
    var keyCode = ('which' in event) ? event.which : event.keyCode;
    isNotWanted = (keyCode == 69);
    return !isNotWanted;
};
function handlePaste(e) {
    var clipboardData, pastedData;
    clipboardData = e.clipboardData || window.clipboardData;
    pastedData = clipboardData.getData('Text').toUpperCase();
    if (pastedData.indexOf('E') > -1) {
        e.stopPropagation();
        e.preventDefault();
    }
};
</script>

我想将用户的输入限制为 5 位数字。例如,对于这个输入框,我希望允许的数字不超过五个(例如 12345)并且没有句点:

<div class="col-md-3">
  <div class="form-group">
    <label>Customer Number</label>
    <div class="input-group">
      <span class="input-group-addon"><i class="fa fa-hashtag"></i></span>
      <input name="CustomerNumber" type="number" class="form-control" onkeydown="return FilterInput(event)" onpaste="handlePaste(event)" required>
    </div>
  </div>
  <!-- /.form-group -->
</div>
<!-- /.col -->

我将如何实现这一目标?我知道

type="text" 

它允许通过使用“maxlength”来限制空间。

【问题讨论】:

  • 无论如何,我强烈建议您考虑一个框架(如 jQuery)并利用该框架提供的验证工具,或针对该框架的验证插件。这个例子相对简单......但是还有许多其他用例足够复杂,您可能不想“重新发明轮子”......
  • 你有我如何在 jQuery 中实现这一点的例子吗?

标签: javascript html webforms


【解决方案1】:

一种方法是捕获输入,检查它是否通过验证检查,如果是,则继续,如果不是,将其设置为最后一个已知的正确值,如下所示:

var oldValue = "";
// listen for "input" event, since that handles all keypresses as well as cut/paste
document.getElementById("myInput").addEventListener('input', function (event) {
  var input = event.target;
  if (validateInput(input.value)) {
    // update old value with new value
    oldValue = input.value;
  }
  else {
    // set value to last known valid value
    input.value = oldValue;
  }
});

function validateInput(str) {
  // check length, if is a number, if is whole number, if no periods
  return /^[0-9]{0,5}$/.test(str);
}
Test: <input type="text" id="myInput"/><br/>
Try typing/pasting invalid input

【讨论】:

  • 这需要做一些工作,因为它会引发类型错误,并且在您的目标 ID 包含任何特殊字符的情况下会出现“)”缺失错误。我最终添加了以下几行来修复这两个问题: var elmId = "id-with-hyphen";函数 updateHTML(elmId, value) { var elem = document.getElementById(elmId); if(typeof elem !== 'undefined' && elem !== null) { elem.innerHTML = value; } }
  • @Ojchris 我真的很困惑你的意思。我发布的代码是一个没有语法错误的实时工作示例。带有连字符 ID 的 HTML 元素仍然可以有效地传递给document.getElementById,所以我不确定为什么会为您抛出错误。我感到困惑的另一件事是为什么要在input 元素上设置innerHTML。设置元素值的正确方法是通过value 属性。除非您没有为 input 元素设置它?您能否详细说明您使用此解决方案的具体用途?
  • 我在评论之前投了赞成票。按原样使用您的 sn-p,我在控制台中得到“TypeError:document.getElementById(...) is null”。深入研究这个错误,我发现出于某种奇怪的原因,js 脚本的加载速度比 html 快,即使脚本放置在 body 标记之前也是如此。所以我使用 updateHTML 进行空值检查。我的输入有一个 id jam-field-another-try-0-value,所以在解决了 typerror 之后,我得到了一个 ')' 缺失的语法错误。 var elm = "edit-field-another-try-0-value" 有助于解决这个问题。介于两者之间,我不是 Js 专家,我可能只是破解了我的方式:)
  • @Ojchris “由于某种奇怪的原因,即使脚本放在 body 标记之前,js 脚本的加载速度也比 html 快” - 这是预期的行为。如果您在渲染元素之前注册事件处理程序(即 之前的 JS),您每次都会看到此错误。这就是为什么 JS 应该在 标记之后加载,并且在“on document ready”函数回调中。
  • mhodges 实际上是指在正文 CLOSING 标签之前 :)
【解决方案2】:

我之前在这里给出的所有答案都已经过时了 我认为解决这个问题的最佳答案是

  1. Javascript slice 用于保持字符长度
  2. Javascript 替换以仅保留数字
  3. javascript oninput 事件防止用户不使用复制粘贴来注入/输入无效字符的javascript。

<script>
function validate(field) {
   let val = field.value;
   let data = val.replace(/[^0-9]/g, "");
   field.value = data.slice(0,16);
}
</script>
<label for="atmno">Payment card Number</label>
<input name="atmno" type="text" oninput="validate(this)">

我在这里写的一篇文章中简要描述了答案:https://shopinson.com/javascript/javascript-validates-payment-card-number/

【讨论】:

    【解决方案3】:

    您可以不选择数字类型输入,而是使用文本类型输入,其中 maxlength 属性有效,如果值不是数字,则使用 JavaScript 引发错误。喜欢,

    if(isNaN(input.value)){ // error code here }
    

    【讨论】:

    • input.value 将始终是一个字符串。您可能应该检查 !isNaN(+input.value) 是否改为。另外,确保数字是整数(没有句点),你可以做很多不同的方法,一个简单的方法是if (+input.value === Math.floor(+input.value))
    • 为什么在 input.value 之前加上 +?
    • 我想您在 isNaN 检查中不需要它,但对于第二次检查,您需要。请参阅我的帖子,了解检查(使用正则表达式)有效输入的最简单方法
    【解决方案4】:

    纯js和dom操作解决方案

    为简单起见添加一个Id属性

    <input type="number" id="in" />
    

    我们将监听 keypress 事件,如果达到最大长度或输入句点,则不执行任何操作,我使用 5 作为最大值。

    let input = document.getElementById('in');
    input.addEventListener('keypress',function test(e){
        if(input.value.length==5 || e.key=='.')
            e.preventDefault();
    });
    

    【讨论】:

    • 我可以将let input = document.getElementById('in'); input.addEventListener('keypress',function test(e){ if(input.value.length==5 || e.key=='.') e.preventDefault(); }); 包裹在&lt;script&gt;&lt;/script&gt; 中吗?
    • 是的,在脚本标签中定义元素后的任何位置,例如在你的身体之后,或者最好是一个外部 js 文件,无论哪种方式你都应该没问题
    【解决方案5】:

    您可以在 filterInput 方法中运行验证检查。

    document.querySelector('.input-group .form-control').addEventListener('keyup', function() {
    var keyCode = ('which' in event) ? event.which : event.keyCode;
      isNotWanted = (keyCode == 69);
    
      if (this.value.length > this.maxLength) {
        this.value = this.value.slice(0, this.maxLength);
      }
    
      return !isNotWanted;
    });
    <div class="col-md-3">
      <div class="form-group">
        <label>Customer Number</label>
        <div class="input-group">
          <span class="input-group-addon"><i class="fa fa-hashtag"></i></span>
          <input maxlength="5" name="CustomerNumber" type="number" class="form-control"  required>
        </div>
      </div>
      <!-- /.form-group -->
    </div>
    <!-- /.col -->

    【讨论】:

    • 从事件侦听器返回值不是标准化的 - 它可能在不同的浏览器中表现不同。
    • 我尝试了代码 sn-p。它仍然允许字母“e”和句点
    猜你喜欢
    • 2022-11-19
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多