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

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

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

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

Q&A

2回答

552閲覧

カウントダウンタイマーにて最終日を取得する方法について

Yui_note

総合スコア15

jQuery

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

0グッド

0クリップ

投稿2020/09/24 06:51

編集2020/09/24 10:11

現在jQueryにて、カウントダウンタイマーを作成しておりますが、
タイマーに指定した期間の最終日にinnerHTMLテキストを変える方法がわかりません。

トライしてみたコードは以下になります。

html

1<div class="main-timer"> 2 <p class="main-timer__text">終了まで</p> 3 <div class="main-timer__num"> 4 <div class="timer" id="timer"></div> 5 </div> 6</div>

js

1document.addEventListener('DOMContentLoaded', function() { 2 var Timer = function(saleStartTime, saleEndTime, endMessage, outputDestination) { 3 this.saleStartTime = saleStartTime; 4 this.saleEndTime = saleEndTime; 5 this.endMessage = endMessage; 6 this.outputDestination = outputDestination; 7 }; 8 9 Timer.prototype.countDown = function() { 10 var saleStartTime = new Date(this.saleStartTime); 11 var saleEndTime = new Date(this.saleEndTime); 12 var oneDay = 24 * 60 * 60 * 1000; 13 var countDownTimer = document.getElementById(this.outputDestination); 14 var endMessage = this.endMessage; 15 var currentTimeCD = new Date(); 16 var untilStartTime = new Date(); 17 var untilFinishTime = new Date(); 18 var date = new Date( 2020, 9, 24 ) ; 19 var lastDay = date.getDate() ; 20 var d = 0; 21 22 setInterval(calculateTime, 1000); 23 24 function calculateTime() { 25 currentTimeCD = new Date(); 26 untilStartTime = saleStartTime - currentTimeCD; 27 untilFinishTime = saleEndTime - currentTimeCD; 28 29 if (currentTimeCD < saleStartTime) { 30 d = Math.floor(untilStartTime / oneDay); 31 } else { 32 d = Math.floor(untilFinishTime / oneDay); 33 } 34 35 showTime(); 36 } 37 38 function showTime() { 39 if (currentTimeCD < saleStartTime) { // キャンペーン開始前 40 countDownTimer.innerHTML 41 = '<span class="main-timer__text">キャンペーン開始前</span>'; 42 } else if (currentTimeCD <= lastDay) { 43 countDownTimer.innerHTML 44 = '最終日'; 45 } else if (currentTimeCD >= saleStartTime && currentTimeCD <= saleEndTime) { // キャンペーン期間中 46 countDownTimer.innerHTML 47 = '<span class="main-timer__text">あと</span>' + d + '<span class="main-timer__text">日</span>'; 48 } else if (saleEndTime < currentTimeCD) { 49 $('.main-timer').css('display', 'none'); 50 } 51 } 52 } 53 54 var myTimer = new Timer('2020/09/24 00:00:00', '2020/09/24 23:59:59', '終了!', 'timer'); 55 myTimer.countDown(); 56}, false)

参考にさせていただいたサイトはこちらになります。https://jsfiddle.net/hasa83/zrhmjut4/17/

実装したいこととしましては、
カウントダウンを指定した日付より前の日では、「キャンペーン開始前」テキストを表示し、
キャンペーン期間中は、「あと〇〇日」の〇〇の部分をカウントダウンで表示し、
キャンペーン最終日には、テキストを「最終日」に変更を行い、
終了後は、HTMLタグ自体を削除する、ということを行いたいと思っております。

最終日のテキストを表示させる以外の挙動は問題なく動くのですが、
最終日テキストのみが、HTMLに出力されません。

条件分岐のところで、指定した期間の間で、数日をピックアップして取得する所の書き方が
恐らく間違えているのではないかと思いますが、
正しい記述方法がわかりません。。

ご存知の方お力をお貸しいただけないでしょうか。
どうぞよろしくお願いいたします。

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

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

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

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

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

m.ts10806

2020/09/24 06:53

「うまくいかない」では他者にはなにも伝わらないので、起きている現象をそのまま具体的に記載してください。
Yui_note

2020/09/24 07:00

ご指摘いただきありがとうございます。 只今質問修正させていただきましたが、「うまくいかない」内容の詳細につきましては、最終日というテキストがHTMLに出力されない状況でした。 説明が不足しておりまして大変失礼いたしました。
kuma_kuma_

2020/09/24 08:40

とりあえず > = '最終日' ここは > = '<span class="main-timer__text">最終日</span>'; こうじゃないの?
Yui_note

2020/09/24 08:54

ありがとうございます。 そちらにつきましては、現状のもので問題ないです。m
guest

回答2

0

カウントダウンを指定した日付より前の日では、「キャンペーン開始前」テキストを表示し、
キャンペーン期間中は、「あと〇〇日」の〇〇の部分をカウントダウンで表示し、
キャンペーン最終日には、テキストを「最終日」に変更を行い、
終了後は、HTMLタグ自体を削除する、ということを行いたいと思っております。

時系列には

-(「キャンペーン開始前」)-> saleStartTime -(「あと○日」)-> lastDay -(「最終日」)-> saleEndTime -> (表示しない)

な感じなのかなと思ったのですが、それだとcurrentTimeCD <= lastDayが気になりました。
lastDayは最終日の00:00になるため、この比較だとlastDayDateオブジェクトに修正しても、
最終日以前の分岐になるような気がします。

それを踏まえると分岐としてはこうなるのかなと思います。

javascript

1if (currentTimeCD < saleStartTime) { // キャンペーン開始前 2 countDownTimer.innerHTML = '<span class="main-timer__text">キャンペーン開始前</span>'; 3} else if (saleEndTime < currentTimeCD) { // キャンペーン終了後 4 $('.main-timer').css('display', 'none'); 5 6//ここから先はキャンペーン期間 7} else if (currentTimeCD >= lastDay) { // 最終日(最終日00:00以降からキャンペーン終了直前) 8 countDownTimer.innerHTML = '最終日'; 9} else { 10 countDownTimer.innerHTML = '<span class="main-timer__text">あと</span>' + d + '<span class="main-timer__text">日</span>';

補足: Dateオブジェクト

Dateを年月日の引数付きで作る時の第2引数は0起点の月です。 参考

そのため、日付を指定したい場合はnew Date("2020/9/24")としたほうが良いような気がします

投稿2020/09/24 11:11

attakei

総合スコア2738

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

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

kuma_kuma_

2020/09/24 11:23

Dateの変換は確かにnew Date("2020/9/24")が良いですね
Yui_note

2020/09/24 11:39 編集

>attakeiさま アドバイスいただきありがとうございます。 まず時系列につきましては、いただいた内容の通りになります。 いただいたコードの考え方がとても参考になります。 試してみました所、キャンペーン中に表示される「あと〇〇日」というところだけが 常に「最終日」 という表示になってしまいます。 その他の以下の3つの動きは実装ができました。 「キャンペーン開始前」のテキスト表示 「最終日」のテキスト表示 キャンペーン終了後にmain-timerを削除 キャンペーン期間中が常に最終日の取得になっている様なので、 こちらの部分を自分の方でももう少し考えてみたいと思います。 後少しのところまできた感じがしています。。 ありがとうございました!m
guest

0

Javascript

1// こうじゃなくて 2// var date = new Date( 2020, 9, 24 ) ; 3// var lastDay = date.getDate() ; // これじゃ24ていう値だよ 4// こう 5 var lastDay = new Date( 2020, 9, 24 ); 6

あとこうしておいた方がよいのでは?

Javascript

1 $('.main-timer__text').css('display', 'none'); 2 countDownTimer.innerHTML 3 = '最終日';

ロジック自体の見直しを要望されているそうなので再編集しました。

Javascript

1document.addEventListener('DOMContentLoaded', function() { 2 3 // 必要ない値は設定しない。ここで行うのは受け取ったパラメータを内部で使用しやすい形にしておく事 4 // 後データ型は揃える。日時ならDate型 5 var Timer = function(saleStartTime, saleEndTime, outputId) { 6 this.saleStartTime = new Date(saleStartTime); // 開始日日時 7 this.saleEndTime = new Date(saleEndTime); // 終了日日日時 8 this.saleLastTime = new Date(this.saleEndTime - (24 * 60 * 60 * 1000)); // 最終日日時(この時点で値は作成しておく) 9 this.outputDestination = document.getElementById(outputId); // この時点で参照も済ます。 10 }; 11 12 function showTime() { 13 var now = new Date(); // 現在日時の取得 14 var tag = ''; // 追加位置が固定ならそこに対してタグを追加する。 15 // この時はこれを追加たり書き換えたり削除したりしない事 16 // あとでCSSの調整ができなくなる。 17 18 // 判定は時間の順番に行う 19 if (now < myTimer.saleStartTime) { 20 // キャンペーン開始前 21 var tag = '<span class="main-timer__text">キャンペーン開始前</span>'; 22 myTimer.outputDestination.innerHTML = tag; 23 } else if (now >= myTimer.saleStartTime && now < myTimer.saleLastTime) { 24 // キャンペーン期間中(最終日前まで) 25 var d = Math.floor((myTimer.saleEndTime - now) / (24 * 60 * 60 * 1000)); // 残り日数の計算 26 tag += '<p class="main-timer__text">終了まで</p>'; 27 tag += '<div class="main-timer__num">'; 28 tag += ' <div class="timer" id="timer">'; 29 tag += ' <span class="main-timer__text">あと</span>' + d + '<span class="main-timer__text">日</span>'; 30 tag += ' </div>'; 31 tag += '</div>'; 32 myTimer.outputDestination.innerHTML = tag; 33 } else if (now >= myTimer.saleLastTime && now < myTimer.saleEndTime) { 34 // キャンペーン期間中最終日 終了! 35 tag += '<p class="main-timer__text">終了!</p>'; // 質問する時タグを省略しない。指定classの影響で表示されない事もある。 36 myTimer.outputDestination.innerHTML = tag; 37 } else if (now >= myTimer.saleEndTime) { 38 // キャンペーン期間終了後 39 } 40 } 41 // こういう時、一般的には'2020/09/25 23:59:59'ではなく'2020/09/26 00:00:00'で作成して判定文を"<="ではなく"<"とする。(23:59:59.1000秒はどうなりますか?) 42 myTimer = new Timer('2020/09/21 00:00:00', '2020/09/26 00:00:00', 'main_message'); 43 44 setInterval(showTime(), 1000); 45}, false)

HTML

1<!doctype html> 2<html lang="ja"> 3<head> 4<meta charset="utf-8"> 5 6 <script src="/jquery.min.js"></script> 7 8<!-- Title --> 9<title>test</title> 10 11</head> 12 13<body> 14<div id="main_message" class="main-timer"> 15</div> 16</html>

投稿2020/09/24 09:09

編集2020/09/25 03:36
kuma_kuma_

総合スコア2506

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

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

Yui_note

2020/09/24 10:01

ありがとうございます。 1つ目にご指摘いただいたJS修正いたしました。 2つ目のコードについては、HTMLタグを削除するだけの目的でしたので、 innnerHTMLは恐らくいらないと思います。違っていたらすみません、。 入れてみましたが、実装したい動きにはなりませんでした。
kuma_kuma_

2020/09/24 10:05

2つ目のコード入れないと あと 最終日 って表示になりませんか? という意味です。 なにか別に処理されているならいりません。
Yui_note

2020/09/24 10:05

あ、、すみません。 main-timer__textの親要素のタグを丸ごと削除してるので、 こちらのタグは削除しないで大丈夫です。
Yui_note

2020/09/24 10:15

あと 最終日 という表示にはなりません。 ありがとうございます。
kuma_kuma_

2020/09/24 10:18

う~ん、ない処理まではこちらで想像できません。 あくまで提供されたソース上でしかお答えできないので... 今回はソースにあった判定の誤りだけで済みましたが、 変に略されると「回答できない」「あやまった回答になる」のでご注意を
Yui_note

2020/09/24 10:28 編集

ご指摘いただいたところに関しては、今回特に問題とは関係のない所ですが、 ソースに中に記述してもので問題ないと思います。 コードを略してもいないです。 説明にも記述しておりますが、 指定した期間の間で、数日をピックアップして取得する所の 条件分岐の書き方のところが恐らく問題なのではと思っております。 そちらにつきまして、もし可能でしたら 書き方のご指導いただけますと大変助かります。 よろしくお願いいたします。
kuma_kuma_

2020/09/24 10:36

?lastDayの値の取り方変更して対応できたのではないのですか?
Yui_note

2020/09/24 10:52 編集

実装したい動きになりませんでしたと、初めにいただいたコメントに対してお伝えさせていただきました。m 現状まだ対応できていないです。
kuma_kuma_

2020/09/24 11:03 編集

?? > 最終日のテキストを表示させる以外の挙動は問題なく動くのですが、 > 最終日テキストのみが、HTMLに出力されません。 こちらでは lastDay = new Date( 2020, 9, 24 ); // 今日を最終日と設定して で提示されたソースで処理が最終日判定でtrueになって あと 最終日 と表示されている事を確認しているのですが? > 1つ目にご指摘いただいたJS修正いたしました。 こちらで動作確認している状態でこれだけ書かれても うまくいったとしか判断できないです。 > main-timer__textの親要素のタグを丸ごと削除してるので 提示されているソースコード上この処理ありませんよね? 先にも書きました通り、変に略されていませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問