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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

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

Q&A

解決済

1回答

827閲覧

javscriptのタイマーで時間によって表示・非表示を切り替えたい

ta01kuya

総合スコア1

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

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

0グッド

1クリップ

投稿2021/11/04 13:48

編集2021/11/04 23:30

実現したいこと

javascripyで作業時間、休憩時間を繰り返すタイマーを作成しています。
休憩時間のタイマーが稼働している時にボタンを表示し、作業時間中はボタンを非表示にしたいです。

該当のソースコード

下記のボタンの表示、非表示を連続で行いたい
<button class="button" id="button">ボタン</button>
index.html.erb

<main class="app"> <progress id="js-progress" value="0"></progress> <div class="progress-bar"></div> <div class="timer"> <div class="button-group mode-buttons" id="js-mode-buttons"> <button data-mode="pomodoro" class="button active mode-button" id="js-pomodoro" > Pomodoro </button> <button data-mode="shortBreak" class="button mode-button" id="js-short-break" > Short break </button> <button data-mode="longBreak" class="button mode-button" id="js-long-break" > Long break </button> </div> <div class="clock" id="js-clock"> <span id="js-minutes">25</span> <span class="separator">:</span> <span id="js-seconds">00</span> </div> <button class="button" id="button">ボタン</button> <button class="main-button" data-action="start" id="js-btn"> Start </button> </div> </main> <%= javascript_pack_tag 'worktimes/time' %>

time.js

const timer = { pomodoro: 25, shortBreak: 5, longBreak: 15, longBreakInterval: 4, sessions: 0, } let interval; const mainButton = document.getElementById('js-btn'); mainButton.addEventListener('click', () => { const { action } = mainButton.dataset; if (action === 'start') { startTimer(); } else { stopTimer(); } }); const modeButtons = document.querySelector('#js-mode-buttons'); modeButtons.addEventListener('click', handleMode); function getRemainingTime(endTime) { const currentTime = Date.parse(new Date()); const difference = endTime - currentTime; const total = Number.parseInt(difference / 1000, 10); const minutes = Number.parseInt((total / 60) % 60, 10); const seconds = Number.parseInt(total % 60, 10); return { total, minutes, seconds, }; } function startTimer() { let { total } = timer.remainingTime; const endTime = Date.parse(new Date()) + total * 1000; if (timer.mode === 'pomodoro') timer.sessions++; mainButton.dataset.action = 'stop'; mainButton.textContent = 'stop'; mainButton.classList.add('active'); interval = setInterval(function() { timer.remainingTime = getRemainingTime(endTime); updateClock(); total = timer.remainingTime.total; if (total <= 0) { clearInterval(interval); switch (timer.mode) { case 'pomodoro': if (timer.sessions % timer.longBreakInterval === 0) { switchMode('longBreak'); } else { switchMode('shortBreak'); } break; default: switchMode('pomodoro'); } } }, 1000); } function stopTimer() { clearInterval(interval); mainButton.dataset.action = 'start'; mainButton.textContent = 'start'; mainButton.classList.remove('active'); } function updateClock() { const { remainingTime } = timer; const minutes = `${remainingTime.minutes}`.padStart(2, '0'); const seconds = `${remainingTime.seconds}`.padStart(2, '0'); const min = document.getElementById('js-minutes'); const sec = document.getElementById('js-seconds'); min.textContent = minutes; sec.textContent = seconds; const text = timer.mode === 'pomodoro' ? 'Pomosto' : 'Take a break!'; document.title = `${minutes}:${seconds} — ${text}`; const progress = document.getElementById('js-progress'); progress.value = timer[timer.mode] * 60 - timer.remainingTime.total; } function switchMode(mode) { timer.mode = mode; timer.remainingTime = { total: timer[mode] * 60, minutes: timer[mode], seconds: 0, }; document .querySelectorAll('button[data-mode]') .forEach(e => e.classList.remove('active')); document.querySelector(`[data-mode="${mode}"]`).classList.add('active'); document.body.style.backgroundColor = `var(--${mode})`; document .getElementById('js-progress') .setAttribute('max', timer.remainingTime.total); updateClock(); } function handleMode(event) { const { mode } = event.target.dataset; if (!mode) return; switchMode(mode); stopTimer(); } document.addEventListener('DOMContentLoaded', () => { switchMode('pomodoro'); });

試したこと

document.getElementById('btn').style.display = 'none';
で非表示にしておき、休憩時間のタイマーの処理の中に
link.style.display = "block";
で表示することはできました。
しかし、その後、再び作業時間になった時に非表示にしたいのですが、その処理がうまくいかないです。

なにかアドバイスを頂ければと思います、よろしくお願いします。

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

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

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

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

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

k4a

2021/11/04 17:36

`うまくいかない`コードを全て記載して下さい
m.ts10806

2021/11/04 21:08

「タイマー」の実装方法は1つではないですし、再現できるコードを提示されないことには何とも言えません。
guest

回答1

0

ベストアンサー

いまいち状況がわかりませんが

javascript

1<script> 2document.addEventListener('DOMContentLoaded', function() { 3 const time={"sagyo":10*1000,"kyukei":3*1000}; 4 let status="sagyo"; 5 let timerId; 6 const loop=()=>{ 7 const t1=new Date().getTime(); 8 document.querySelectorAll('#sagyo,#kyukei').forEach(x=>x.setAttribute("hidden","1")); 9 document.querySelector('#'+status).removeAttribute("hidden"); 10 let t0=time[status]; 11 timerId=setInterval(()=>{ 12 const t2=new Date().getTime(); 13 const t3=t0+t1-t2; 14 if(t3<=0){ 15 clearInterval(timerId); 16 status=status=="sagyo"?"kyukei":"sagyo"; 17 loop(); 18 } 19 const h=(parseInt(t3/60/1000)).toString().padStart(2,'0'); 20 const m=(parseInt(t3/1000)%60).toString().padStart(2,'0'); 21 const ms=(parseInt(t3/10)%100).toString().padStart(2,'0'); 22 timer.textContent=`${h}:${m}.${ms}`; 23 },10); 24 } 25 loop(); 26}); 27</script> 28<div class="timer" id="timer"></div> 29<div id="sagyo">作業中:10<br> 30<button class="button" id="button">ボタン</button></div> 31<div id="kyukei">休憩中:3</div>

投稿2021/11/05 01:44

yambejp

総合スコア116724

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

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

ta01kuya

2021/11/05 09:13

ありがとうございます! どのようにしてbuttonの表示・非表示が切り替わっているのか分からず、自分のコードではそのように実装できませんでした、、 もし可能でしたらどのようにして表示非表示を切り替えているか教えていただけますか?
yambejp

2021/11/05 09:15

表示を切り替えるエリアをつくって、idを指定して表示/非表示を切り替えています
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問