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

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

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

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

JavaScript

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

Q&A

2回答

3896閲覧

javascript 全角文字入力時の input イベントの動作について

bananachips

総合スコア0

HTML5

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

JavaScript

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

0グッド

1クリップ

投稿2022/05/28 08:53

下に示しました html を実行すると

■表示されるテキストボックスに、半角で 123 と入力すると、123 と出力されます。
これは期待通りの動作です。

■全角で 123 と入力すると、112123 と出力されます。
全角入力で確定していない文字列が取込まれる印象を持ちました。
コンソールのログは以下の通りでした。

全角1を入力する
s1= 1
s2= 1
引き続いて、全角2を入力する
s1= 112
s2= 112
引き続いて、全角3を入力する
s1= 112123
s2= 112123

★質問内容は、
全角で 123 と入力した時に、どうして半角で 123 と入力した時とは異なる振る舞いになるのか?
になります。よろしくお願い致します。

実行環境
windows10 google chrome

html

1<!DOCTYPE html> 2<html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>文字列置換</title> 6 </head> 7 <body> 8 <p>入力</p> 9 <input id="text1" type="text"/> 10 11 <script type="text/javascript"> 12 document.getElementById("text1").addEventListener("input", function(e) { 13 // 入力 14 const s1 = e.currentTarget.value 15 console.log("s1=", s1) 16 17 // 全角英数字 → 半角英数字 に変換する 18 const s2 = s1.replace(/[A-Za-z0-9]/g, (v) => { 19 return String.fromCharCode(v.charCodeAt(0) - 0xFEE0) 20 }) 21 console.log("s2=", s2) 22 23 // 出力 24 document.getElementById("text1").value = s2 25 }) 26 </script> 27 </body> 28</html>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/05/28 09:16 編集

このコメントは回答欄に移しました。
guest

回答2

0

IME入力で確定前のテキストも <input>value プロパティで取れるようになってます。たしか、Safari と Chrome に共通の動作で IE や Firefox ではそんなことは起きません。

回避するには、compositionstart イベントから compositionend イベントまでの間は input イベントを無視して、compositionend イベントのときに value プロパティを処理します。

投稿2022/05/29 22:27

int32_t

総合スコア20882

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

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

0

input イベントに代えて change イベントを使ったらどうなるでしょう?

change イベントはテキストボックスからフォーカスが外れた時発生するので問題は回避できるのではないかと思われます。

投稿2022/05/28 09:16

編集2022/05/28 09:20
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

bananachips

2022/05/28 09:30

回答、ありがとうございます。 次のステップとして実現したいことがあります。 入力中に文字列をカウントし、例えば、5文字の時と、それ以外の時で、 テキスト入力エリアの背景色を変更することを考えています。 入力文字数が5文字になった瞬間に背景色を変更し、6文字になったらまた元に戻す、という動作です。
退会済みユーザー

退会済みユーザー

2022/05/28 09:50

このスレッドの課題の全角英数字 ⇒ 半角英数字変換は上の回答で解決したのでしょうか? 解決したのであればこのスレッドはクローズしてください。 > 次のステップとして実現したいことがあります。 それはこのスレッドの課題である全角英数字 ⇒ 半角英数字変換とは別の課題なので、新たに別のスレッドを立てて質問してください。
bananachips

2022/05/28 10:55

質問内容は、 全角文字入力時の input イベントの動作についてです。 input イベントを使用した時に、全角文字入力がどうして 112123 と変換されるのか? なので、まだ解決していないと考えております。
退会済みユーザー

退会済みユーザー

2022/05/28 11:15 編集

> input イベントを使用した時に、全角文字入力がどうして 112123 と変換されるのか? そこは質問者さんの推測「全角入力で確定していない文字列が取込まれる印象を持ちました」が当たっていると思いますけど? さらに深く掘り下げて、漢字かな変換ソフト(IME 他いろいろある)とブラウザ(これも Chrome 他いろいろある)の JavaScript の動作・相性とかの解析まで必要なのですか? それは気の遠くなるような話で自分にはそこまで考える気力はないです。お役に立てずすみませんが、他の方の回答をお待ちください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問