Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Обратный отчет таймер (https://javascript.ru/forum/css-html/75930-obratnyjj-otchet-tajjmer.html)

FotGOD 18.11.2018 13:28

Обратный отчет таймер
 
Всем привет. Подскажите в чем проблема, где ошибки. Код не хочет работать.
<div class="container">
	<h2>Home Work 2</h2>
	<div class="box hide"></div>
	<div id="showtime">00:00</div>
    <button id="start" class="btn btn-primary">START</button>
    <br>
    <br>
    <form name="form">
    <div>
           Day: <input id='day_id'>
    </div>
    <div>
           hours: <input id='hour_id'>
    </div>
    <div>
           minutes: <input id='minute_id'>
    </div>
   

</form>

</div>


function  timer(){
        let day= getElementById('day_id').value;
        let hour=getElementById('hour_id').value;
        let  minute=getElementById('minute_id').value;
        let second=59;
      const now = new Date()
          , newTime = new Date(now.getFullYear()+ 1, 0, 1)
          ,  diff = newTime.getTime() - now.getTime()
          , days = day
          , hours = hour
          , minutes = minute
          , seconds = 59 - now.getSeconds()
      ;

      let st = '';
      if(diff <= 0) {
          st  = window.open("http://google.com");
       } else {
        st=`${days} days, ${hours} hours,${minutes}minutes,${seconds}seconds`;
      }
document.getElementById('start').addEventListener('click', timer);

      document.getElementById("showtime").innerHTML = st;
      setTimeout(timer, 1000);
  }
  timer();

j0hnik 18.11.2018 13:35

метод getElementById вызывайте у document
document.getElementById()

если вызывать его как вы, интерпретатор будет пытаться его найти в window, а там такого метода нет

FotGOD 18.11.2018 13:41

Цитата:

Сообщение от j0hnik (Сообщение 498864)
метод getElementById вызывайте у document
document.getElementById()

если вызывать его как вы, интерпретатор будет пытаться его найти в window, а там такого метода нет

Не обратил внимание, благодарю. но все равно, при вводе значений, и нажатие кнопки старт - ничего не происходит.

j0hnik 18.11.2018 14:00

FotGOD,
так вы сразу функцию вызываете, вот он и тикает сразу

<div class="container">
		<h2>Home Work 2</h2>
		<div class="box hide"></div>
		<div id="showtime">00:00</div>
		<button id="start" class="btn btn-primary">START</button>
		<br>
		<br>

		<form name="form">
			<div>
				Day: <input id='day_id'>
			</div>
			<div>
				hours: <input id='hour_id'>
			</div>
			<div>
				minutes: <input id='minute_id'>
			</div>
		</form>

	</div>


	<script>

		function  timer(){
			let day= document.getElementById('day_id').value;
			let hour = document.getElementById('hour_id').value;
			let  minute = document.getElementById('minute_id').value;
			let second = 59;
			const now = new Date()
			, newTime = new Date(now.getFullYear()+ 1, 0, 1)
			,  diff = newTime.getTime() - now.getTime()
			, days = day
			, hours = hour
			, minutes = minute
			, seconds = 59 - now.getSeconds()
			;

			let st = '';
			if(diff <= 0) {
				st  = window.open("http://google.com");
			} else {
				st=`${days} days, ${hours} hours,${minutes}minutes,${seconds}seconds`;
			}
			document.getElementById('start').addEventListener('click', timer);

			document.getElementById("showtime").innerHTML = st;
			setTimeout(timer, 1000);
		}
		timer();


	</script>

FotGOD 18.11.2018 14:12

Цитата:

так вы сразу функцию вызываете, вот он и тикает сразу



<script>

function timer(){
let day= document.getElementById('day_id').value;
let hour = document.getElementById('hour_id').value;
let minute = document.getElementById('minute_id').value;
let second = 59;
const now = new Date()
, newTime = new Date(now.getFullYear()+ 1, 0, 1)
, diff = newTime.getTime() - now.getTime()
, days = day
, hours = hour
, minutes = minute
, seconds = 59 - now.getSeconds()
;

let st = '';
if(diff <= 0) {
st = window.open("http://google.com");
} else {
st=`${days} days, ${hours} hours,${minutes}minutes,${seconds}seconds`;
}
document.getElementById('start').addEventListener( 'click', timer);

document.getElementById("showtime").innerHTML = st;
setTimeout(timer, 1000);
}
timer();


</script>[/html]
вынес
document.getElementById('start').addEventListener('click', timer);
это из функции и заработала кнопка. А почему не уменьшаются минуты, когда секунда доходит до нуля?

j0hnik 18.11.2018 14:52

<input type="number" id="day">Дней<br>
	<input type="number" id="hour">Часов<br>
	<input type="number" id="min">Минут<br>
	<button id="st">start</button>
	<div id="time"></div>
	<script>

		var end;
		function timer(){
			var now = new Date(),
			ost = new Date(end - now),
			s = Math.floor(ost/1000),
			m = Math.floor(s/60),
			h = Math.floor(m/60),
			d = Math.floor(h/24);
			s = s%60+'';
			m = m%60+'';
			h = h%24+'';
			d = d+'';
			if(ost>0){
				setTimeout(timer, 1000);
				time.textContent = `${d}-дней ${h}-часов ${m}-минут ${s}-секунд`;
			}
			else window.open("http://google.com");
		}
		st.onclick = e =>{
			end = Date.now() + ( day.value*86400000 ) + ( hour.value*3600000) + ( min.value* 60000);
			timer();
		};

	</script>

FotGOD 18.11.2018 15:33

Цитата:

Сообщение от j0hnik (Сообщение 498870)
<input type="number" id="day">Дней<br>
	<input type="number" id="hour">Часов<br>
	<input type="number" id="min">Минут<br>
	<button id="st">start</button>
	<div id="time"></div>
	<script>

		var end;
		function timer(){
			var now = new Date(),
			ost = new Date(end - now),
			s = Math.floor(ost/1000),
			m = Math.floor(s/60),
			h = Math.floor(m/60),
			d = Math.floor(h/24);
			s = s%60+'';
			m = m%60+'';
			h = h%24+'';
			d = d+'';
			if(ost>0){
				setTimeout(timer, 1000);
				time.textContent = `${d}-дней ${h}-часов ${m}-минут ${s}-секунд`;
			}
			else window.open("http://google.com");
		}
		st.onclick = e =>{
			end = Date.now() + ( day.value*86400000 ) + ( hour.value*3600000) + ( min.value* 60000);
			timer();
		};

	</script>

Благодарю. Я пытался написать еще в условии так
If(seconds==0){minutes--; } и так для всех переменных, но не сработало. Не подскажите почему?

j0hnik 18.11.2018 17:14

Цитата:

Сообщение от FotGOD
Благодарю. Я пытался написать еще в условии так
If(seconds==0){minutes--; } и так для всех переменных, но не сработало. Не подскажите почему?

if в нижнем регистре должен быть

FotGOD 18.11.2018 19:03

Цитата:

Сообщение от j0hnik (Сообщение 498884)
if в нижнем регистре должен быть

Я его в нижнем и писал. Просто телефон здесь сейчас в сообщении исправляет заглавные буквы. Даже в нижнем регистре код не хотел работать

j0hnik 18.11.2018 19:04

FotGOD,
сделайте минимальный макет

FotGOD 18.11.2018 20:11

Цитата:

Сообщение от j0hnik (Сообщение 498891)
FotGOD,
сделайте минимальный макет

чтото типа такого я пробовал:
function timer() {
   let day = document.getElementById('day_id').value;
   let hour = document.getElementById('hour_id').value;
   let minute = document.getElementById('minute_id').value;
   let second = 59;
   const now = new Date(),
     newTime = new Date(now.getFullYear() + 1, 0, 1),
     diff = newTime.getTime() - now.getTime(),
     days = day,
     hours = hour,
     minutes = minute,
     seconds = 59 - now.getSeconds();
 
   let st = '';
   if(seconds==0){
       minutes--;
   }
   if(minutes==0&&seconds==0)
   {
       hours--;
   }
   if (diff <= 0) {
    st  = window.open("http://google.com");

   } else {
     st = `${days} days, ${hours} hours,${minutes}minutes,${seconds}seconds`;
   }
   document.getElementById("showtime").innerHTML = st;
 }
 
 document.getElementById('start').addEventListener('click', () => setInterval(timer, 1000));
 timer();

j0hnik 18.11.2018 20:15

FotGOD,
minutes объявлены константой, константы меняться не должны. замените на var

FotGOD 19.11.2018 09:14

Цитата:

Сообщение от j0hnik (Сообщение 498897)
FotGOD,
minutes объявлены константой, константы меняться не должны. замените на var

Почти:) минута убавилась и вернулась разу на то число какое я ей присвоил в инпуте.
получается к minutes заново присваивается minute.
Если сделать так
hours = 23 - now.getHours()
          , minutes = 59 - now.getMinutes()
          , seconds = 59 - now.getSeconds()

то идет нормально отчет, но с 59 минуте,
а если присваивать через инпат
hours = hour-now.getHours(),
     minutes = minute-now.getMinutes(),
     seconds = 59 - now.getSeconds()

то сразу минуты и часы идут в минус, но не возвращается та цифра, которую присвоил через minute.

Чтото не так делаю

FotGOD 19.11.2018 12:24

Попробовал сделать так, но тогда без кнопки старт все идет, и не вписываются минуты:
где
document.getElementById('start').addEventListener('click', () => setInterval(timer, 1000))
, вообще ничего не решает, его даже не замечает интерпретатор
function timer(){

let day = document.getElementById('day_id').value;
   let hour = document.getElementById('hour_id').value;
   let minute = document.getElementById('minute_id').value;
   let second = 59;

 let st='';
   var IdInt=setInterval(function(){
if(hour<=0&&minute<=0&&second<=0){
    var openurl=window.open("http://google.com");
}
document.getElementById("showtime").innerHTML = st;

if(second>=0){
    st = `${day} days, ${hour} hours,${minute}minutes,${second}seconds`;
}
second=second-1;
if(second==0){
    minute--;
    second=59;
}


   }, document.getElementById('start').addEventListener('click', () => setInterval(timer, 1000))
);


. Это уже просто мысли в слух, на " а вдруг". Но пока не в верном направлении иду...


Часовой пояс GMT +3, время: 09:43.