🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

Q&A

解決済

1回答

1194閲覧

javascriptで関数を同時に二つ動かしたい

chuchutakotako

総合スコア13

JavaScript

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

0グッド

1クリップ

投稿2019/10/24 03:33

いまタイピング練習するためのWebアプリを作ろうと考えています。
アプリはマナビスのタイピング練習サイトと同じような感じにしたいと考えています。

https://manabi.benesse.ne.jp/gakushu/typing/nihongonyuryoku.html

このサイトではスタートボタンを押してからカウントダウン機能が動きながらも、文字が入力されるとそれが合っているか正誤判定がされます。
この機能をjavascriptで実現するにはどのようにしたらよいでしょうか?

自分で、カウントダウンを行う関数と正誤判定をする関数をつくってみたのですが、正誤判定関数を動かすとカウントダウン関数がとまってしまい、
思っているようにうごきません。

解決策があれば教えていただけるとありがたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

カウントダウン機能

は基本的に非同期処理なので、文字入力の正誤判定と競合しないはずです

sample

javascript

1<script> 2window.addEventListener('DOMContentLoaded', ()=>{ 3 document.querySelector('#txt').addEventListener('input',e=>{ 4 if(e.target.value=="abc"){ 5 clearInterval(timerId); 6 alert('good!'); 7 } 8 }); 9 var count=10; 10 var timerId=setInterval(countdown=()=>{ 11 document.querySelector('#timer').value=count; 12 if(count<=0) clearInterval(timerId); 13 count--; 14 return countdown; 15 },1000); 16}); 17</script> 18<input type="text" id="txt">(abcと入力) 19<input type="text" id="timer">

再調整

javascript

1<script> 2window.addEventListener('DOMContentLoaded', ()=>{ 3 var timerId; 4 var countdown; 5 document.querySelector('#start').addEventListener('click',e=>{ 6 var count=100; 7 e.target.disabled=true; 8 with(document.querySelector('#txt')){ 9 disabled=false; 10 value=""; 11 focus(); 12 } 13 timerId=setInterval(countdown=()=>{ 14 document.querySelector('#timer').value=(count%10==0)?(count/10+".0"):count/10; 15 if(count<=0){ 16 clearInterval(timerId); 17 e.target.disabled=false; 18 document.querySelector('#txt').disabled=true; 19 } 20 count--; 21 return countdown; 22 },100); 23 }); 24 document.querySelector('#txt').addEventListener('input',e=>{ 25 if(e.target.value=="abc"){ 26 clearInterval(timerId); 27 document.querySelector('#start').disabled=false; 28 e.target.disabled=true; 29 alert('good!'); 30 } 31 }); 32}); 33</script> 34<input type="button" id="start" value="start"> 35<input type="text" id="txt" disabled>(abcと入力) 36<input type="text" id="timer" readonly>

投稿2019/10/24 03:39

編集2019/10/24 04:27
yambejp

総合スコア116661

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

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

chuchutakotako

2019/10/24 03:50

なるほど、作れるはずなのですね・・・ それだとなぜちゃんと動かないのかわからなくなってしまいました・・・ 関数が動いている状態でbuttonタグのonclickで関数を動かすと止まる みたいな制約があったりするのでしょうか?
yambejp

2019/10/24 04:03

調整版載せましたが、とくに変な制約はないと思います
chuchutakotako

2019/10/24 04:15

わざわざありがとうございます!! 調整版のほうを動かしてみたのですが、文字の判定が行われるとカウントダウンがとまり、もう一度startボタンを動かさなければいけませんでした。 動かし方が悪かったのでしょうか?
chuchutakotako

2019/10/24 04:20

すみません自己解決しました。 buttonタグのtypeを指定しておらず初期値のsubmitになっていたためボタンを押すたびにページがリロードされ関数が止まってしまっていました。 typeをbuttonにすることで解決しました。 ありがとうございました!!!
yambejp

2019/10/24 04:28

一部再調整しておきました
chuchutakotako

2019/10/24 04:56

わざわざお付き合いいただきありがとうございました!! 再調整版はちゃんと動作していました!! 参考にさせていただきます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問