LoginSignup
0
0

More than 1 year has passed since last update.

<input>で正の整数値のみを入力できるようにする

Posted at

<input type="number">で数値のみの入力にすることはできますが、正負を表す+-、少数を表す.、べき乗を表すeが入力できてしまいます。

これらをVueのディレクティブを使って一括で正の整数のみ入力できるようにします。

plugins/integer.directive.ts
import Vue from 'vue';

const targets = ['+', '-', '.', 'e'];
const listen = (element: HTMLInputElement) => {
  element.addEventListener('keydown', event => {
    if (targets.includes(event.key)) {
      event.preventDefault();
    }
  });
  // コピペ対策
  element.addEventListener('input', event => {
    let value = (event.target as any).value as string;
    targets.forEach(char => (value = value.replaceAll(char, '')));
    (event.target as any).value = value;
  });
};

/**
 * v-integer
 *
 * inputタグにて、正の整数のみを許容する
 */
Vue.directive('integer', {
  bind(el, _binding, _vnode) {
    if (el instanceof HTMLInputElement) {
      listen(el);
    } else {
      const elements = el.getElementsByTagName('input');
      if (elements.length) listen(elements[0]);
    }
  },
});

inputイベントでreplaceしているのは、コピペした場合にkeydownでは弾けないので追加してます。
ただ、+1234みたいに先頭に+がある数値をコピペするとevent.target.value1234+なしの値が設定されていました。。。
そんなことやるやつはまれだと思うので今回は無視しますが、解決できるのであれば解決しておきたいですね。

test.vue
<template>
  <input v-integer type="number">
</template>
nuxt.config.js
  plugins: [
    '~/plugins/integer.directive.ts',
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0