过滤输入文本只接受数字和点vue.js

Muh*_*bar 17 vue.js

我有一个文本框只想接受"数字"和".[点]"使用Vue.js,任何人都可以帮助代码?我是vue的新人.

Dee*_*arg 43

您可以编写Vue方法,并且可以在keypress事件上调用该方法.看看这个小提琴.

更新:

添加源代码:

HTML

<div id="demo">
  <input v-model="message" @keypress="isNumber($event)">
</div>
Run Code Online (Sandbox Code Playgroud)

Vue.js

var data = {
  message: 1234.34
}

var demo = new Vue({
  el: '#demo',
  data: data,
  methods: {
    isNumber: function(evt) {
      evt = (evt) ? evt : window.event;
      var charCode = (evt.which) ? evt.which : evt.keyCode;
      if ((charCode > 31 && (charCode < 48 || charCode > 57)) && charCode !== 46) {
        evt.preventDefault();;
      } else {
        return true;
      }
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 实际上绑定应该是`v-on:keypress ="isNumber($ event)"` (6认同)
  • 为了不允许句点将`charCode!== 46`改为`charCode === 46` (3认同)
  • 我实现了这个,除了一件事以外它运作良好.我不得不在数据中定义事件,否则会引发控制台错误.我只是添加了"event:null"而没有更多的错误! (3认同)
  • 我在您的js小提琴中尝试过,我可以输入1个以上的句点。只能是1。怎么做? (3认同)
  • 这不处理粘贴随机字符串。 (3认同)
  • 这个手柄怎么贴? (2认同)

小智 15

这是我的解决方案。这里的大多数答案已被弃用。此外,输入值始终返回一个字符串,即使您键入一个数字也是如此。因此,这里的一些解决方案对我不起作用。

在我的情况下,我不想要小数点,但为了这个线程的目的,我将它添加到数组中。

<b-form-input v-model.number="quantity" @keypress="isNumber($event)" type="number"></b-form-input>


isNumber (evt: KeyboardEvent): void {
                const keysAllowed: string[] = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.'];
                const keyPressed: string = evt.key;
                if (!keysAllowed.includes(keyPressed)) {
                    evt.preventDefault()
                }
            }
Run Code Online (Sandbox Code Playgroud)

  • 这应该是主要答案。大多数其余答案都使用已废弃的“event.keyCode” (3认同)
  • 然而,我最喜欢的答案是用 TypeScript 编写的。 (2认同)

Men*_*eng 11

简短易懂。

的HTML

 <input @keypress="onlyNumber" type="text">
Run Code Online (Sandbox Code Playgroud)

VUE JS

onlyNumber ($event) {
   //console.log($event.keyCode); //keyCodes value
   let keyCode = ($event.keyCode ? $event.keyCode : $event.which);
   if ((keyCode < 48 || keyCode > 57) && keyCode !== 46) { // 46 is dot
      $event.preventDefault();
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 这样也不允许“ Backspace”按键。如果我想删除以前的号码并添加另一个号码怎么办? (3认同)

JBe*_*gle 11

您应该更改输入以type="number"更准确地反映您的行为。然后,您可以使用内置的Vue.js指令v-model.number

用法:

<input type="number" v-model.number="data.myNumberData"/>
Run Code Online (Sandbox Code Playgroud)

  • 对于数字输入,使用 `type=number` 并不总是一个好的解决方案,因为浏览器会以不同的方式设置输入框的样式并添加递增/递减按钮。 (4认同)
  • 一些浏览器有 `type=number` 的 `onScroll`,它增加/减少值。 (3认同)
  • 这个答案有效,但只有一个字符(E)允许输入。为什么有任何理由? (2认同)
  • @SudhirKGupta 科学符号,例如 1.2e-1,即 0.12 (2认同)
  • 这仍然允许具有多个小数点的条目,例如 1.2.3.4.5 (2认同)

Ste*_*veC 8

在以前的解决方案的基础上,为了防止出现多个小数位,还将 v 模型传递给函数:

<input v-model="message" v-on:keypress="isNumber($event, message)">

并修改 isNumber 方法如下:

isNumber(event, message) {
  if (!/\d/.test(event.key) &&  
    (event.key !== "." || /\./.test(message))  
  )  
    return event.preventDefault();  
}
Run Code Online (Sandbox Code Playgroud)

要限制小数点后的位数,请将以下行添加到 isNumber 方法中:

 if (/\.\d{2}/.test(message)) return event.preventDefault();
Run Code Online (Sandbox Code Playgroud)

限制\d{2}输入两位数字。将此更改为\d{1}限制为 1。

正如其他答案中所述,这不会阻止粘贴非数字数据。


小智 7

在一行中执行此操作的简单方法:

IsNumber(event) {
  if (!/\d/.test(event.key) && event.key !== '.') return event.preventDefault();
}
Run Code Online (Sandbox Code Playgroud)

  • 我不知道性能(因为正则表达式),但是如果您正在检查数字,这应该是唯一的答案...... (3认同)
  • 对我来说有效 `if (!/^[0-9]+$/.test(event.key) || event.key === '.') return event.preventDefault();` (2认同)

fla*_*dmg 5

我通过vue.js过滤器解决了你的问题.首先我创建了filter - 比如说在filters.js文件中

export const JustDigits = () => {
  Vue.directive('digitsonly', (el, binding) => {
    if (/[\d\.]+/i.test(el.value)) {
      console.log('ok');
    } else {
      let newValue = el.value.replace(/[a-zA-Z]+/ig, '');
      el.value = newValue;
      console.log('should fix', newValue);
      binding.value = el.value;
    }
  });
};
Run Code Online (Sandbox Code Playgroud)

然后在需要此功能的组件中,我做了:

import {
  JustDigits
} from './filters';

JustDigits();
Run Code Online (Sandbox Code Playgroud)

然后你就可以在模板中使用这个指令:

 <input  v-model="myModel"
         v-digitsonly
         type="text"  
         maxlength="4"  class="form-control" id="myModel" name="my_model" />
Run Code Online (Sandbox Code Playgroud)

请注意,我的正则表达式可能与您需要的不同,请随意修改它以及let newValue = el.value.replace(/[a-zA-Z]+/ig, '');从字符串中删除字符的代码行.我发布它只是为了向您展示vue.js提供的解决此类任务的可能解决方案之一.


D D*_*ham 5

这是通过使用以下指令设置 v-restrict.number.decimal 来处理所提出的特定问题(仅限数字和“点”)的更好方法。它还有一些奖励代码来支持仅 alpha 或字母数字。您也可以只允许“点”,尽管我不知道您为什么会这样做。如果输入速度快,它将不允许额外的字符“潜入”。它还支持复制/粘贴、删除和其他一些用户希望仍然可以通过输入工作的键:

Vue.directive('restrict', {
  bind (el, binding) {
    el.addEventListener('keydown', (e) => {
      // delete, backpsace, tab, escape, enter,
      let special = [46, 8, 9, 27, 13]
      if (binding.modifiers['decimal']) {
        // decimal(numpad), period
        special.push(110, 190)
      }
      // special from above
      if (special.indexOf(e.keyCode) !== -1 ||
        // Ctrl+A
        (e.keyCode === 65 && e.ctrlKey === true) ||
        // Ctrl+C
        (e.keyCode === 67 && e.ctrlKey === true) ||
        // Ctrl+X
        (e.keyCode === 88 && e.ctrlKey === true) ||
        // home, end, left, right
        (e.keyCode >= 35 && e.keyCode <= 39)) {
        return // allow
      }
      if ((binding.modifiers['alpha']) &&
        // a-z/A-Z
        (e.keyCode >= 65 && e.keyCode <= 90)) {
        return // allow
      }
      if ((binding.modifiers['number']) &&
        // number keys without shift
        ((!e.shiftKey && (e.keyCode >= 48 && e.keyCode <= 57)) ||
        // numpad number keys
        (e.keyCode >= 96 && e.keyCode <= 105))) {
        return // allow
      }
      // otherwise stop the keystroke
      e.preventDefault() // prevent
    }) // end addEventListener
  } // end bind
}) // end directive
Run Code Online (Sandbox Code Playgroud)

使用:

<!-- number and decimal -->
<input
  v-model="test"
  v-ep-restrict.number.decimal
  ...
/>

<!-- alphanumeric (no decimal) -->
<input
  v-model="test2"
  v-ep-restrict.alpha.number
  ...
/>

<!-- alpha only -->
<input
  v-model="test3"
  v-ep-restrict.alpha
  ...
/>
Run Code Online (Sandbox Code Playgroud)

这可以修改为几乎任何场景的基础,这里有一个很好的关键代码列表


Ada*_*dam 5

我需要我的输入只允许数字,所以不能有e符号、加号、减号或.。Vue 看起来很时髦,并且不会重新@onkeypress触发dot.

这是我对这个问题的解决方案:

<input
  onkeypress="return event.key === 'Enter'
    || (Number(event.key) >= 0
    && Number(event.key) <= 9"
  type="number"
>
Run Code Online (Sandbox Code Playgroud)

我只接受数字,限制从 0 到 9,但我也确实希望在 Enter 上启用表单提交,这将被上述方法排除 - 因此输入。

  • 条件中缺少括号,但效果很好!:竖起大拇指: (2认同)