HTMLとJavaScriptで作ったタイマーアプリが正常に動作しなくて困っています。以下がそのコードです。まだ整理していないので、タイマーの位置などが変ですが。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>タイマーアプリ</title>
<style>
form {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
}
label {
font-size: 24px;
margin-bottom: 16px;
}
input {
font-size: 24px;
padding: 8px;
margin-bottom: 16px;
text-align: center;
}
button {
font-size: 24px;
padding: 8px 16px;
margin: 8px;
}
#display {
font-size: 48px;
margin-bottom: 16px;
}
</style>
</head>
<body>
<form>
<label for="time">タイマーの長さ(秒):</label>
<input type="number" id="time" name="time" min="1" required>
<button id="start" onclick="startTimer(event)">スタート</button>
<button id="pause" onclick="pauseTimer(event)">一時停止</button>
<button id="reset" onclick="resetTimer()">リセット</button>
</form>
<div id="display">0:00</div>
<script>
let timeLeft = 0;
let timerId = null;
let pausedTime = 0;
function startTimer(event) {
event.preventDefault();
if (timerId !== null) {
return;
}
timeLeft = parseInt(document.getElementById("time").value);
timerId = setInterval(() => {
timeLeft--;
if (timeLeft === 0) {
clearInterval(timerId);
timerId = null;
playSound();
}
updateDisplay();
}, 1000);
}
function pauseTimer(event) {
event.preventDefault();
if (timerId !== null) {
clearInterval(timerId);
timerId = null;
pausedTime = timeLeft;
document.getElementById("pause").textContent = "再開";
} else {
timeLeft = pausedTime;
startTimer(event);
document.getElementById("pause").textContent = "一時停止";
}
}
function resetTimer() {
if (confirm("本当にリセットしますか?")) {
clearInterval(timerId);
timerId = null;
timeLeft = 0;
pausedTime = 0;
updateDisplay();
}
}
function updateDisplay() {
const minutes = Math.floor(timeLeft / 60);
const seconds = timeLeft % 60;
document.getElementById("display").textContent = `${minutes}:${seconds.toString().padStart(2, "0")}`;
}
function playSound() {
const audio = new Audio("timer.mp3");
audio.loop = true;
audio.play();
}
</script>
</body>
</html>
このコードを実行して、タイムを入力して、スタートボタンを押して、そこで一時停止ボタンを押して、一時停止された状態で再開ボタンを押すと続きからタイマーが始まるようにしたいのですが、最初から担ってしまいます。どうしたらいいのでしょうか。教えてください。
No.7ベストアンサー
- 回答日時:
No.1 です。
================
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>タイマーアプリ</title>
<style>
form {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
}
label {
font-size: 24px;
margin-bottom: 16px;
}
input {
font-size: 24px;
padding: 8px;
margin-bottom: 16px;
text-align: center;
}
button {
font-size: 24px;
padding: 8px 16px;
margin: 8px;
}
#display {
font-size: 48px;
margin-bottom: 16px;
}
</style>
</head>
<body>
<form>
<label for="time">タイマーの長さ(秒):</label>
<input type="number" id="time" name="time" min="1" required>
<button id="start" onclick="startTimer(event)">スタート</button>
<button id="pause" onclick="pauseTimer(event)">一時停止</button>
<button id="reset" onclick="resetTimer()">リセット</button>
</form>
<div id="display">0:00</div>
<script>
let timeLeft = 0;
let timerId = null;
let pausedTime = 0;
function startTimer(event) {
event.preventDefault();
if (timerId !== null) {
return;
}
/*** ↓↓↓この辺を変えた↓↓↓ ***/
// timeLeft = parseInt(document.getElementById("time").value);
if (pausedTime == 0) {
timeLeft = parseInt(document.getElementById("time").value);
} else {
timeLeft = pausedTime
}
/*** ↑↑↑この辺を変えた↑↑↑ ***/
timerId = setInterval(() => {
timeLeft--;
if (timeLeft === 0) {
clearInterval(timerId);
timerId = null;
//playSound();
}
updateDisplay();
}, 1000);
}
function pauseTimer(event) {
event.preventDefault();
if (timerId !== null) {
clearInterval(timerId);
timerId = null;
pausedTime = timeLeft;
document.getElementById("pause").textContent = "再開";
} else {
timeLeft = pausedTime;
startTimer(event);
document.getElementById("pause").textContent = "一時停止";
}
}
function resetTimer() {
if (confirm("本当にリセットしますか?")) {
clearInterval(timerId);
timerId = null;
timeLeft = 0;
pausedTime = 0;
updateDisplay();
}
}
function updateDisplay() {
const minutes = Math.floor(timeLeft / 60);
const seconds = timeLeft % 60;
document.getElementById("display").textContent = `${minutes}:${seconds.toString().padStart(2, "0")}`;
}
function playSound() {
const audio = new Audio("timer.mp3");
audio.loop = true;
audio.play();
}
</script>
</body>
</html>
================
No.6
- 回答日時:
こんな感じでしょうか。
<form>
<div id="display">0:00</div>
<label for="time">タイマーの長さ(秒):</label>
<input type="number" id="time" name="time" min="1" required>
<button id="start" onclick="startTimer(event)">スタート</button>
<button id="reset" onclick="resetTimer(event)">リセット</button>
</form>
<script>
const timer = {
_start: document.getElementById("start"),
_display: document.getElementById("display"),
_reset: document.getElementById("reset"),
left: 0,
id: null,
on () {
this._start.textContent = "一時停止";
this.display(this.left);
const start = Date.now();
const left = this.left;
this.id = setInterval(()=>{
this.left = left - (Date.now() - start) / 1000;
if(this.left < 0) {
this.reset();
}
this.display(this.left);
}, 100);
},
off(){
clearInterval(this.id);
this.id = null;
this._start.textContent = "再開";
},
reset () {
clearInterval(this.id);
this.id = null;
this._start.textContent = "スタート";
this.left = 0;
this.display(0);
},
display (left) {
left = Math.ceil(left);
const m = Math.floor(left / 60);
const s = (left % 60).toString().padStart(2, '0');
this._display.textContent = `${m}:${s}`;
}
}
function startTimer(event) {
event.preventDefault();
timer.left = (timer.left === 0) ? parseInt(document.getElementById("time").value) : timer.left;
if(timer.id){
timer.off();
}else {
timer.on();
}
}
function resetTimer(event) {
event.preventDefault();
if (confirm("本当にリセットしますか?")) {
timer.reset();
}
}
</script>
No.5
- 回答日時:
こんばんは
>再開ボタンを押すと続きからタイマーが始まるようにしたいのですが、
>最初から担ってしまいます。
再開時の pauseTimer の処理内で、
>timeLeft = pausedTime;
>startTimer(event);
と timeLeft に値を戻しているつもりのようですが(実際には、この処理には意味がなさそうですが)、その後で startTimer を呼び出しているので、そちらで値が初期値にリセットされますよね?
>timeLeft = parseInt(document.getElementById("time").value);
ここの流れを修正すれば、ご希望の動作になると思います。
なお、以下はご質問には直接関係はありませんけれど・・・
一時停止中にも「スタート」は押せますが、その場合は最初からのカウントになりますね。
これは、予定通りの仕様でしょうか?
また、時間の計測が SetInterval の interval に依存する形式になっていますけれど、必ずしも正確とは言えません。(たいして誤差はないとは思いまが)
PCのタイマーを参照して、経過時間を計算するような方式にしておく方が、なんらかの遅延が生じた際にも、正確さを維持できることを期待できます。
No.4
- 回答日時:
関数 startTimer の引数で区別しましょう
例)
startTimer(evnet, 設定秒数)
* スタートボタンの場合は time から読み込み値を設定秒数に指定
* 再開ボタンの場合は pausedTime の値を設定秒数に指定
余談ながら
setInterval の精度はあまりよろしくないので、
毎回の残秒数の計算は現在時刻から算出することをお勧めします。
例)
残秒数 = 設定秒数 - (現在時刻 - 開始時刻)
No.2
- 回答日時:
No.1 です。
途中で送信してしまった。startTimerで、pausedTimeが0の時は parseInt(document.getElementById("time").value) を、pausedTimeが0でないなら pausedTime をtimeLeftに入れる、とかですかね。
もっとスマートな方法はありそうですが、お手軽なのはこんな感じかと。
No.1
- 回答日時:
再開したときに
> timeLeft = pausedTime;
で一時停止時の時間をtimeLeftに入れていますが、その後の
> startTimer(event);
で
> timeLeft = parseInt(document.getElementById("time").value);
とまた元の指定値を入れているからですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript プログラムがうまく動きませんレビューお願いします 1 2022/07/10 05:08
- JavaScript コードレビューをお願いします。 1 2022/07/16 05:38
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript 【JavaScript】検索がヒットした場合、プルダウンをオープンで表示させる方法 2 2023/09/06 14:02
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript vertical sliderをautoplayしたい 2 2022/08/25 14:47
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- HTML・CSS ボタンが押されたらWebページの文字コードを 変える、というプログラミングを書きたいです。 目的は文 1 2023/11/21 00:33
- HTML・CSS HTMLでwebサイトを作ってるのですが、 ボタンが押された時にjsに書いている文章の 文字コードを 1 2023/11/16 23:21
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
HTMLとJavaScriptで作ったタイマーアプリで時間分の設定方法がわからない
JavaScript
-
かっこいいウェブを作るテク
HTML・CSS
-
プログラミング言語の制作方法について
C言語・C++・C#
-
-
4
HTMLでデスクトップの画像がでない
HTML・CSS
-
5
JavaScriptで作ったアプリが正常に動作しない。改善したい。
JavaScript
-
6
これの対応OSを教えて下さい。php-8.3.0-src.zip
PHP
-
7
HTMLでstyleを指定するフォームの作り方
HTML・CSS
-
8
HTMLです ブロック要素にするにはどうすれば良いですか?教えてくださいお願いします
HTML・CSS
-
9
HTMLで画像をポップアップで表示するようにする方法
HTML・CSS
-
10
デジタルブックを自分のウェブサイトに設置する方法を教えて
オープンソース
-
11
Colorboxがうまく設置できません
JavaScript
-
12
SFTPなどは使わないホームページやプログラムファイルの公開方法
PHP
-
13
PHP8を使うと、大量のWarningが発生してしまいます。
PHP
-
14
SQLの中上級者へのレベルアップ方法について
Oracle
-
15
フロントエンドフレームワークの定数について
JavaScript
-
16
ホームページの事でおしえてください
CGI
-
17
htmlの修正方法を教えていただきたいです。
HTML・CSS
-
18
[初心者]javascriptのfor文でなぜか繰り返し処理をしない。理由がわかりません。
JavaScript
-
19
HTMLでwebサイトを作ってるのですが、 ボタンが押された時にjsに書いている文章の 文字コードを
HTML・CSS
-
20
【JavaScript?HTML?】Webページでこのページは戻ることは出来ませんと表
JavaScript
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
javascriptテキストBOX色を元に...
-
テキストエリア内の一部の文字...
-
HTMLタグに複数のクラスを設定...
-
createElementが一瞬で消えてし...
-
MAX関数を使ってからLEFT JOIN...
-
読み込んだQRコードをフォーム...
-
マウスを乗せるとメニュー表示
-
変数名をどのようにつけるのが...
-
removeEventListenerについて
-
jqueryを使って無駄なspanタグ...
-
外部ページからハッシュタグ(...
-
フッターの下に隙間ができてしまう
-
HTMLですCSSです この画像のよ...
-
背景色と連動するスライドショ...
-
スライドショー「Skitter」をカ...
-
1枚の画像をクリックすると複数...
-
web制作(HP作成について教えて...
-
textareaに画像を表示したい
-
スワップイメージのフェード方...
-
アコーディオンメニューが開い...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MAX関数を使ってからLEFT JOIN...
-
HTMLタグに複数のクラスを設定...
-
変数名をどのようにつけるのが...
-
401エラードキュメントを401.ht...
-
javascriptテキストBOX色を元に...
-
読み込んだQRコードをフォーム...
-
タブで開いてさらにタブ内をア...
-
createElementで作成した要素を...
-
removeEventListenerについて
-
表示・非表示のスクリプトで、...
-
HTMLとJavaScriptで作ったタイ...
-
HTMLとJavaScriptで作ったタイ...
-
getElementByIdの戻り値がnull...
-
指定したパスが現URLに含まれて...
-
[急ぎ] videoタグで埋め込んだm...
-
IFRAMEの表示/非表示を切り替え...
-
iframe内のリンクが飛ばないの...
-
removeAttribute()メソッドで削...
-
背景色を透明化
-
jQueryで同じid属性が複数あっ...
おすすめ情報
できれば実際のコードも教えていただきたいです。
できればindex.htmlにそのまま貼り付けて使用することができるコード全体も教えていただきたいです。