勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

input type="number"がFirefoxやSafariで正常に動作しない

  HTML

input type="number"を設置したFormがFirefoxやiPhone Safariで正常に動作しなかった。具体的には文字が入力できてしまったり、文字入力後にバリデートしようとすると空判定になる。input type="text"に変えられない事情があったためinput type="number"のままで対応する方法のメモ。

 

具体的な症状

以下のようなソースコードがあったとする。

<input type="number" id="test_number">
<button type="button" id="test_button">test button</button>
<script type="text/javascript" src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script type="text/javascript">
$(function(){
    $('#test_button').on('click', function(){
        console.log($('#test_number').val());
    });
});
</script>

問題点は以下の通り。

  1. 数値以外の文字が入力できてしまう。また、文字入力後ボタンを押した際に<empty string>が返る
  2. 全角数値も通してしまう。また、文字入力後ボタンを押した際に半角数値が返る(10を入力すると10が返る)

1の方が難儀で未入力チェックが難しくなる。これがChromeだと数値以外は入力できなかったり、全角数値を入力すると自動で半角数値に書き換えてくれる。

 

対応方法

<input type="number" step="1" min="1" max="100" pattern="[0-9]*" oninput="this.value = this.value.replace(/[^0-9]/g, '');">

pattern属性とoninputイベントで半角数値のみ入力できるように制御する。

 

所感

input type="number"は他にも問題があるようで基本的に使わない方が無難な気がする。

とはいえinput type="number"のままでデザイン済みのコーディングデータをいただいているような場合、勝手にinput type="text"に変えるというのも難しいところ。そのようなケースの場合は今回の方法で対応する。

 - HTML

  関連記事

フォームの入力内容をjQueryで取得し、本文として設定した上でメーラーを起動させる方法

formで何らかを入力してもらいボタンをクリックするとメーラーが開き、先ほど入力 ...

readonlyについて

日付ピッカーとかをテキストボックスに入れた際に、 ピッカー入力とあわせて直接入力 ...

HTMLで画像の指定した部分のみリンクを設定する方法

画像を表示させて、その画像の一部分のみにリンクを張りたかった。画像を重ね合わせた ...

form送信後にURLにアンカータグ(ハッシュタグ)をつける方法

フォームからGETもしくはPOSTで送信し、その後のURLにアンカータグ(ハッシ ...

lazyload.js等のライブラリを使わずHTMLのみで画像の遅延読み込みを行う方法

画像を遅延読み込みさせるとなるとだいぶ前に書いたlazyload.jsを用いる方 ...