質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

540閲覧

半角数字と半角ハイフン以外入力できないテキストボックスを作りたい

inputman

総合スコア1

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

1クリップ

投稿2023/09/02 16:37

実現したいこと

  • HTMLとjsを使って電話番号などの入力を想定した、半角数字と半角ハイフン以外入力できないテキストボックスを作る。

前提

ChatGPTが生成したコードをそのまま使用。
jsを使用し、inputイベントが発生する度に正規表現による入力値の置換を行う。

発生している問題・エラーメッセージ

テキストボックスに適当な半角数字かハイフンを何文字か入力しておきます。
その状態で全角文字を入力しようとしても仕様通り入力ができないかと思います。
しかしそれを無視して大量の全角文字を入力し続けると、入力していた半角数字かハイフンまで何故か消えてしまいます。

該当のソースコード

HTML

1<!DOCTYPE html> 2<html> 3<head> 4 <title>半角数字と半角ハイフンのみ入力</title> 5</head> 6<body> 7 <label for="inputField">入力フィールド:</label> 8 <input type="text" id="inputField"> 9 10 <script> 11 // 入力フィールドを取得 12 var inputField = document.getElementById('inputField'); 13 14 // イベントリスナーを追加して、入力内容が変更された際に制限をかける処理を実行 15 inputField.addEventListener('input', function() { 16 // 入力された値を取得 17 var inputValue = inputField.value; 18 19 // 正規表現を使用して、半角数字と半角ハイフン以外の文字を削除 20 var sanitizedValue = inputValue.replace(/[^0-9-]/g, ''); 21 22 // フィールドの値を制限した値に設定 23 if (inputValue !== sanitizedValue) { 24 inputField.value = sanitizedValue; 25 } 26 }); 27 </script>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

私の環境では chrome → 再現した、firefox → 再現しない(問題なし) で、
chrome の方は全角1文字ずつ入力する → 元々あった半角数字の末尾1文字ずつ置き換わってだんだん短くなっていく…のような挙動でした。
なんとなくIME入力中文字列(js側処理で消えてない)とinput.valueに残った文字列が干渉しているような気がします。
原因特定はできませんでしたが、タイミング問題ではなく、IME入力状態そのものがinputイベントと相性が悪そうです。

案1 inputイベント以外

inputでは入力途中状態のテキストを扱うことになると思うので
テキスト確定済みでないと発火しないイベント(blurとかchangeとか)にすればおそらく問題はなくなると思います。
ただしリアルタイムで1文字ずつ検証はできず、入力が終わったと思ったら急に書き換えられるのでユーザ体験的には微妙かも…?

案2 IME状態にあわせて制御

input イベントの InputEvent.isComposing をチェックするか、または
compositionstart/compositionsend イベントも組み合わせるかして
IME入力確定後のみ置き換える、などの処理にするとうまくいくかもしれません。

案3 標準のバリデーションを用いる

input 要素の pattern 属性にバリデーションを任せる手もあります。
(submitしない場合は checkValidity メソッドで自力検証になりますが…)
CSSと組み合わせて背景色を変えたり警告表示とかもできるので、ユーザにも分かりやすくできるかもしれません。


※しっかりと調べたり検証したりはしてないので、環境依存やブラウザのバージョンによっては動いたり動かなかったりする案もあるかもしれません

投稿2023/09/03 08:44

pecmm

総合スコア760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問