teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

変更

2019/01/22 09:56

投稿

Chandler_Bing
Chandler_Bing

スコア673

title CHANGED
File without changes
body CHANGED
@@ -4,6 +4,12 @@
4
4
  先にPHPで締め切り時間をとってきます。その時点で過去であれば挙動は問題ないのですがJSで残り時間が0になると
5
5
  location.reloadのところに行かずに、また残り23時間59分59秒と新たにカウントダウンが始まってしまいます。どこが問題でしょうか。
6
6
 
7
+ 【追記】
8
+ また残り23時間59分59秒と新たにカウントダウンが始まってしまいます
9
+
10
+ これについてですが、このプログラムの制御は残り時間が1時間を切ったら1秒更新でタイマーを切り替えています。
11
+ 残り時間が0秒になり、新たに残り23時間59分59秒と新たにカウントダウンが始まって場合は1秒更新でプログラムが動いているので制御はできていると思うのですが、コンソールすると時間にマイナス表記がありません。なぜでしょうか。
12
+
7
13
  ```
8
14
  <?php
9
15
 

2

変更

2019/01/22 09:56

投稿

Chandler_Bing
Chandler_Bing

スコア673

title CHANGED
@@ -1,1 +1,1 @@
1
- JavaScriptよるPHP変数の値変更
1
+ JavaScriptよる時間制御
body CHANGED
@@ -1,96 +1,109 @@
1
- オークションの残り時間と入札ボタンを表示するプログラムがあります。完成品に入る前のプロトタイプですが。
1
+ PHP変数$endがfalseであれば入札するボタンを
2
- PHPの変数$endでこのオークションの残り時間が残っているかいないか判定します。
2
+ trueあれば'このオークションは終了しました'と表示させたいです。
3
- JavaScript内で残り時間が0になった時点で、$endの変数をtrueに変更したいのですが、どのように行えば良いですか。
4
- JSからPHPに値を渡すのと同じ作業ですか。
5
3
 
6
- 「追記1」
7
- 実現したい機能は、間切になれ入札ボタンをこのオークション終了してますという文字に変更したいです
4
+ 先にPHPで締め切り時間をきます。その点で過去であれば挙動問題なですがJSで残り時間が0になると
8
- 厳密にいうと、時間っている場合のみ入札ボタンを表示させたいです。
5
+ location.reloadのころに行かずにまた残り23時間59分59秒と新たにカウントダウンが始まってします。どこが問題でしょうか。
9
6
 
10
- ```PHP
7
+ ```
11
8
  <?php
9
+
12
10
  $end = false;
11
+ $year = 2019;
12
+ $month = 01;
13
+ $day = 20;
14
+ $hour = 19;
15
+ $minute = 37;
16
+ $second = 00;
17
+ $datetime = new DateTime("$year/$month/$day $hour:$minute:$second");
18
+ $current = new DateTime('now');
19
+ $diff= $current->diff($datetime);
20
+
21
+ if ($diff ->invert == 1) {
22
+ $end = true;
23
+ }
24
+
13
25
  ?>
14
- <html>
15
26
 
27
+ <!DOCTYPE html>
28
+ <html lang="en" dir="ltr">
29
+
16
30
  <head>
17
- <meta charset="UTF-8">
31
+ <meta charset="utf-8">
18
- <meta name="viewport" content="width=device-width,initial-scale=1">
19
- <meta http-equiv="x-ua-compatible" content="IE=edge">
20
- <title>5-01_countdown</title>
32
+ <title></title>
21
- <link href="../../book-js/_common/css/style.css" rel="stylesheet" type="text/css">
22
- <link rel="stylesheet" href="css.css">
33
+ <link rel="stylesheet" href="">
34
+ <script src="../Shopping/jquery-3.3.1.min.js"></script>
23
35
  </head>
24
36
 
25
37
  <body>
26
38
 
27
- <header>
28
- <div class="header-contents">
39
+ <div class="dobid">
29
- <h1>カウントダウンタイマー</h1>
30
- <h2>1秒ごとに再計算する</h2>
31
- </div>
32
- </header>
33
40
 
34
- <div class="main-wrapper">
35
-
36
- <section>
37
- <p><span id="timer"></span>で終了</p>
38
- </section>
39
-
40
- <?php if($end == false): ?>
41
+ <?php if ($end == false): ?>
41
- <a class="btn" href="">入札する</a>
42
+ <a href="#">入札する</a>
43
+ <span>残り</span><span class="time"></span>
42
- <?php elseif($end == true): ?>
44
+ <?php elseif ($end == true): ?>
43
- <span>このオークションは終了しました</span>
45
+ <p>このオークションは終了しました</p>
44
46
  <?php endif ?>
45
47
 
46
48
  </div>
47
49
 
48
- <footer>JavaScript Samples</footer>
50
+ </body>
49
51
 
50
- <script>
52
+ <script>
53
+ var end = '<?php echo $end; ?>';
51
- var goal = new Date();
54
+ var year = '<?php echo $year; ?>';
52
- goal.setHours(20);
53
- goal.setMinutes(00);
55
+ var month = '<?php echo $month; ?>';
54
- goal.setSeconds(00);
56
+ var day = '<?php echo $day; ?>';
57
+ var hour = '<?php echo $hour; ?>';
58
+ var minute = '<?php echo $minute; ?>';
55
59
 
56
- var countdown = function() {
57
- var now = new Date();
60
+ var cutoff = new Date();
58
- var rest = goal.getTime() - now.getTime();
61
+ cutoff.setFullYear(year);
59
- var sec = Math.floor(rest / 1000) % 60;
60
- var min = Math.floor(rest / 1000 / 60) % 60;
61
- var hours = Math.floor(rest / 1000 / 60 / 60) % 24;
62
- var days = Math.floor(rest / 1000 / 60 / 60 / 24);
63
- var count = [days, hours, min, sec];
62
+ cutoff.setMonth(month);
63
+ cutoff.setDate(day);
64
- return count;
64
+ cutoff.setHours(hour);
65
+ cutoff.setMinutes(minute);
65
- }
66
+ cutoff.setSeconds(00);
66
67
 
67
- var recalc = function() {
68
+ var countdown = function(cutoff) {
68
- var count = countdown();
69
+ var now = new Date();
70
+ var rest = cutoff.getTime() - now.getTime();
69
- if (count[3] < 0) {
71
+ var sec = Math.floor(rest / 1000) % 60;
72
+ var min = Math.floor(rest / 1000 / 60) % 60;
70
- document.getElementById('end').textContent = '終了しました';
73
+ var hours = Math.floor(rest / 1000 / 60 / 60) % 24;
71
- } else {
72
- var time = count[1] + '時間' + count[2] + '分' + count[3] + '秒';
74
+ var days = Math.floor(rest / 1000 / 60 / 60 / 24);
73
- document.getElementById('timer').textContent = time;
75
+ var count = [days, hours, min, sec];
74
- refresh();
76
+ return count;
75
- }
77
+ }
76
- }
77
78
 
78
- var refresh = function() {
79
+ var recalc = function() {
80
+ var count = countdown(cutoff);
79
- setTimeout(recalc, 1000);
81
+ if (count[2] < 0) {
82
+ location.reload();//質問
83
+ } else {
84
+ var time = count[1] + '時間' + count[2] + '分' + count[3] + '秒';
85
+ $('.time').text(time);
86
+ refresh();
80
87
  }
88
+ }
81
89
 
82
- var count = countdown();
90
+ var refresh = function() {
91
+ setTimeout(recalc, 1000);
92
+ }
83
93
 
94
+ if (end == false) {
95
+ var count = countdown(cutoff);
96
+
84
- if (count[3] < 0) {
97
+ if (count[2] < 0) {
85
- document.getElementById('end').textContent = '終了';
98
+ location.reload();//質問
86
99
  } else if (count[1] < 1) {
87
100
  recalc();
88
101
  } else {
89
102
  var time = count[1] + '時間' + count[2] + '分' + count[3] + '秒';
90
- document.getElementById('timer').textContent = time;
103
+ $('.time').text(time);
91
104
  }
105
+ }
92
- </script>
106
+ </script>
93
- </body>
94
107
 
95
108
  </html>
96
109
 

1

追記

2019/01/20 10:47

投稿

Chandler_Bing
Chandler_Bing

スコア673

title CHANGED
File without changes
body CHANGED
@@ -3,6 +3,9 @@
3
3
  JavaScript内で残り時間が0になった時点で、$endの変数をtrueに変更したいのですが、どのように行えば良いですか。
4
4
  JSからPHPに値を渡すのと同じ作業ですか。
5
5
 
6
+ 「追記1」
7
+ 実現したい機能としては、時間切れになれば入札ボタンをこのオークションは終了していますという文字に変更したいです。
8
+ 厳密にいうと、時間残っている場合のみ入札ボタンを表示させたいです。
6
9
 
7
10
  ```PHP
8
11
  <?php