javascript - 如何防止无效输入

标签 javascript html validation

let el = document.querySelector('#input');

el.onkeyup = function(e) {
  if (e.target.willValidate && !e.target.validity.valid) {
    // invalid
    e.preventDefault();
  }
};

el.oninput = function(e) {
  result.innerHTML = e.target.value;
};
<input type="number" min="0" max="10" id="input">
<span id="result"></span>

因此,如果我输入或粘贴无效值,例如 11结果 不会更新。如何确保输入忽略无效输入和/或恢复到最后一个有效值?

最佳答案

您可以保存对最后一个有效值的引用,并在放入无效内容时插入它:

let el = document.querySelector('#input');

let lastVal;
el.oninput = function(e) {
  if (this.willValidate && !this.validity.valid) {
    this.value = lastVal;
  } else {
    lastVal = el.value;
    result.innerHTML = e.target.value;
  }
};
<input type="number" min="0" max="10" id="input">
<span id="result"></span>

还可以通过拦截导致输入更改的所有方法,通过检查选择索引来确定新值是什么以及新添加的值是什么(并且可能删除旧的文本部分,如果它们)来完成被选中),然后使用 preventDefault 来阻止输入无效文本,但是对于基本相同的结果来说,这会变得更加复杂。

使用相同方法的 Vue 中的示例片段:

var app = new Vue({
  el: '#app',
  data: {
    val: '',
    oldVal: ''
  },
  watch: {
    val(newVal) {
      if (!(newVal >= 1 && newVal <= 10)) {
        this.val = this.oldVal;
      } else {
        this.oldVal = newVal;
      }
    }
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <input v-model="val">
  <span>{{ val }}</span>
</div>

关于javascript - 如何防止无效输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59656939/

相关文章:

html - 将 UL 放在 SPAN 的右侧

Javascript:为什么在 js 中仍然存在时使用 getElementById(id) 获取元素?

javascript - 针对 :hover DOM with querySelectorAll 的问题

javascript - 带有热重载的 webpack-dev-server 使用 css 更改重新加载整个页面

python - 模型表单无法使用 OneToOneField(User) 进行验证

javascript - 如何在 HTML5 中取消无效事件

validation - 如何将一个错误提供程序应用于所有空文本框 VB.net 2010

javascript - 使用 PHP 和 JavaScript 将文本复制到剪贴板?

javascript - 单击删除元素 - 使用 AngularJS 指令

javascript - Python WebSocket 不工作