【问题标题】:Disable keypress on numbers greater than 3 digits禁用大于 3 位数字的按键
【发布时间】:2021-03-31 04:38:00
【问题描述】:

我有这个代码,如果输入的位数大于 3,我想阻止用户输入。 因此,如果用户写例如 150 就可以了,如果他尝试写一个 4 位或更多位的数字:例如 1601,那么代码应该会阻止这种情况。

所以它必须禁用按键。

<template>
  <b-form-input type="number" v-model="number" @input="getPeople(number)">
  </b-form-input>
</template>

<script>
  export default {
    data() {
      return {
        number: "",
      };
    },
    getPeople(text) {
      if (text.length >= 3) {
        text.preventDefault();
      }
    },
  };
</script>

截至目前,代码不起作用,错误内容如下:

 v-on handler: "TypeError: text.preventDefault is not a function"

【问题讨论】:

    标签: javascript vue.js input keypress


    【解决方案1】:

    最好的 UI/UX 不是阻止用户输入无效数据,而是告诉他们为什么无效,什么时候无效。如果您对为什么会这样感兴趣,这是一个漫长的讨论,这可能不是概述它的最佳位置。但这归结为:以最大可能的尊重对待您的用户。不允许打字与该原则相矛盾。

    回到你的例子,处理它的基本方法是使用max 属性:

    <b-form-input
      type="number"
      v-model="number"
      max="999"
      @input="getPeople(number)" />
    

    如果您想更好地控制验证消息的显示方式以及何时触发验证,您可以使用BootstrapVue's documentation 中概述的验证插件(因为您使用的是 BV)。

    请注意,您需要更新标记以匹配首选验证插件的要求。


    如果您(或您的客户)真的想在input 事件中调用preventDefault(),根据BV documentation

    您始终可以使用 .native 修饰符访问本机 inputchange 事件。

    您必须应用 .native 修饰符才能将本机 event 作为参数。否则你只会得到value

    <b-form-input
      type="number"
      v-model="number"
      @input.native="getPeople" />
    

    并将getPeople修改为:

    methods: {
      getPeople(event) {
        if (event.target.value >= 1e3) {
          event.preventDefault();
          this.number = 999;
        }
      }
    }
    

    看看它的工作原理:

    let memory = 0;
    
    new Vue({
      el: '#app',
      data: () => ({
        number: 0
      }),
      methods: {
        getPeople(event) {
          if (event.target.value >= 1e3) {
            event.preventDefault();
            this.number = memory;
          } else {
            memory = event.target.value;
          }
        }
      }
    })
    <link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap/dist/css/bootstrap.min.css" />
    <link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.min.css" />
    <script src="//polyfill.io/v3/polyfill.min.js?features=es2015%2CIntersectionObserver"></script>
    <script src="//unpkg.com/vue@latest/dist/vue.min.js"></script>
    <script src="//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.min.js"></script>
    
    <div id="app" class="m-5">
      <b-form-input type="number" v-model="number" @input.native="getPeople" />
    </div>

    【讨论】:

    • 您告诉我的第一种情况我也可以考虑,但在第二种情况下,您实际上给出了与我找到的相同且相同的解决方案,并且我已经写过它不起作用的问题.. .确实这是完全错误的,因为如果我做一个控制台。 “event.target.value”的日志甚至告诉我它是“未定义的”
    • @luca88 听起来您还没有将标记从@input="getPeople(number)" 更改为@input="getPeople"。如果我发布的内容对您没有帮助,您可能需要提供 runnable minimal reproducible example 以便我进行检查。我们一定是忽略了一些东西,而不是检查实际代码,我已经帮不了你了。
    • 但我相信这已经可以玩了...只需使用 bootstrap vue 在 vue 中启动一个新项目,然后粘贴我应该已经可以工作的代码...您还缺少什么?
    • @luca88,您可能是对的,但如果错误是由于您未包含的某些内容造成的,我将创建一个项目并无缘无故地浪费我的时间。此外,如果我为我回答的每个问题创建一个项目,我将需要更多的磁盘空间。最后但并非最不重要的一点是,我是决定是否以及如何提供帮助的人,因为您是需要帮助的人,而我是提供帮助的人。如果您需要类似多文件节点的在线编辑器,请使用 codesandbox.io
    • 哇!谢谢!最后一件事,在相同的方法(getPeople)中,我无法获得用户将写入的“v-model”值来做其他事情?或者我应该创建其他类似的东西:@keypress=getNumberPeople(number)
    猜你喜欢
    • 2017-04-02
    • 2014-08-05
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    相关资源
    最近更新 更多