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

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

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

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

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

294閲覧

数字入力で次のフォーカスへ、でもコードが長い。

himejiy3

総合スコア77

HTML5

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

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2017/07/15 14:50

###前提・実現したいこと
数字を1桁入力したらフォーカスが移動し、選択状態になってくれれば良いのですが、
御覧の通りJavaScript文が長いです。
何かもっと、上手い書き方があるのではないでしょうか。

###該当のソースコード

html

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <title>数当てゲーム</title> 6</head> 7<body> 8 <div>4つの数字入力をどうぞ</div> 9 <input type="number" id="kai1" min="0" max="9" value="0" autofocus /> 10 <input type="number" id="kai2" min="0" max="9" value="0" /> 11 <input type="number" id="kai3" min="0" max="9" value="0" /> 12 <input type="number" id="kai4" min="0" max="9" value="0" /> 13 <input type="button" id="kaiket" value="決定" /><br /> 14 <div id="hyouji">表示</div> 15 16 <script src="main.js"></script> 17</body> 18</html>

JavaScript

1{ 2 'use strict'; 3document.addEventListener('DOMContentLoaded',function(){ 4 let kai1 = document.getElementById('kai1'); 5 let kai2 = document.getElementById('kai2'); 6 let kai3 = document.getElementById('kai3'); 7 let kai4 = document.getElementById('kai4'); 8 let kaiket = document.getElementById('kaiket'); 9 let hyouji = document.getElementById('hyouji'); 10 11kai1.addEventListener('focus',function(){ 12 kai1.select();}) 13kai2.addEventListener('focus',function(){ 14 kai2.select();}) 15kai3.addEventListener('focus',function(){ 16 kai3.select();}) 17kai4.addEventListener('focus',function(){ 18 kai4.select();}) 19 20kai1.addEventListener('keyup',function(evt){ 21 let kc = evt.keyCode; 22 if (kc>=96 && kc<=105){ //テンキーの0~9が押されたら、適当な処理をしつつ 23 hyouji.textContent = "キーコード:"+kc+"が押されました"; 24 kai2.focus();} //次のinputへフォーカスを移す 25}) 26kai2.addEventListener('keyup',function(evt){ 27 let kc = evt.keyCode; 28 if (kc>=96 && kc<=105){ //テンキーの0~9が押されたら以下同文 29 hyouji.textContent = "キーコード:"+kc+"が押されました"; 30 kai3.focus();} 31}) 32kai3.addEventListener('keyup',function(evt){ 33 let kc = evt.keyCode; 34 if (kc>=96 && kc<=105){ //テンキーの0~9が押されたら以下同文 35 hyouji.textContent = "キーコード:"+kc+"が押されました"; 36 kai4.focus();} 37}) 38kai4.addEventListener('keyup',function(evt){ 39 let kc = evt.keyCode; 40 if (kc>=96 && kc<=105){ //テンキーの0~9が押されたら以下同文 41 hyouji.textContent = "キーコード:"+kc+"が押されました"; 42 kaiket.focus();} 43}) 44kaiket.addEventListener('click',function(){ //決定ボタンでひとまず終了 45 hyouji.textContent = "お終い";} 46) 47},false); 48} 49

###試したこと
name属性やclass属性を追加すれば良いのかなぁ・・
配列みたいな考え方で書く方法があるのかなぁ・・
と思って試したのですが、上手く出来ませんでした。
よろしくお願いします。

###補足情報(言語/FW/ツール等のバージョンなど)
chromeで動いてくれればOKです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下のように行ってみてはいかがでしょうか?

HTML

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <title>数当てゲーム</title> 6</head> 7<body> 8<div>4つの数字入力をどうぞ</div> 9<input type="number" id="kai1" min="0" max="9" value="0" autofocus/> 10<input type="number" id="kai2" min="0" max="9" value="0"/> 11<input type="number" id="kai3" min="0" max="9" value="0"/> 12<input type="number" id="kai4" min="0" max="9" value="0"/> 13<input type="button" id="kaiket" value="決定"/><br/> 14<div id="hyouji">表示</div> 15 16<script> 17 "use strict"; 18 document.addEventListener("DOMContentLoaded", function () { 19 const kaiket = document.getElementById("kaiket"); 20 const hyouji = document.getElementById("hyouji"); 21 const kai = document.querySelectorAll("input[type='number']"); 22 23 for (let i = 0; i < kai.length; i++) { 24 kai[i].addEventListener("focus", function () { 25 kai[i].select(); 26 }); 27 28 let focusTarget = i + 1 === kai.length ? kaiket : kai[i + 1]; 29 kai[i].addEventListener("keyup", function (evt) { 30 let kc = evt.keyCode; 31 if (kc >= 96 && kc <= 105) { 32 hyouji.textContent = "キーコード:" + kc + "が押されました"; 33 focusTarget.focus(); 34 } 35 }); 36 } 37 38 kaiket.addEventListener("click", function () { 39 hyouji.textContent = "お終い"; 40 }); 41 }, false); 42</script> 43</body> 44</html>

投稿2017/07/15 15:22

s8_chu

総合スコア14731

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

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

himejiy3

2017/07/16 04:41

おぉ、こんな書き方が。ありがとうございます。 該当する要素を配列で返すメソッドの利用法をいまいち理解していなかったようです… 取りあえずquerySelectorAllメソッド、学習しておきます。 あと、なにげにconstにしておくところも「なるほど」と思いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問