Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Обратный таймер (https://javascript.ru/forum/misc/23957-obratnyjj-tajjmer.html)

kuzkuz 13.12.2011 12:55

Обратный таймер
 
Привет всем!
В javascript профан, нужна очень помощь.
Нужен скрипт таймера обратного отсчета(час, минута, секунда) с кнопкой пауза!
Облазил весь интернет ничего подходящего найти не смог!:help:

Livanderiaamarum 13.12.2011 13:01

вам как удобнее, водить в функцию время с которого начнется обратный отсчет таймера? или вводить в функцию дату до которой будет отсчитывать таймер)?

kuzkuz 13.12.2011 13:35

Цитата:

Сообщение от Livanderiaamarum (Сообщение 142452)
вам как удобнее, водить в функцию время с которого начнется обратный отсчет таймера? или ввоодить дату до которой будет отсчитывать таймер)?

Удобнее если время будет задаваться в самом скрипте а на экране будет виден только время и кнопка старт/пауза, т.е. первый раз запустил отсчет например 45 минут и далее пауза останавливает обратный отсчет и таже кнопка его возобновляет.

Livanderiaamarum 13.12.2011 13:46

Цитата:

Сообщение от kuzkuz (Сообщение 142458)
Удобнее если время будет задаваться в самом скрипте а на экране будет виден только время и кнопка старт/пауза, т.е. первый раз запустил отсчет например 45 минут и далее пауза останавливает обратный отсчет и таже кнопка его возобновляет.


ответь на вопрос?!

kuzkuz 13.12.2011 13:54

Цитата:

Сообщение от Livanderiaamarum (Сообщение 142459)
ответь на вопрос?!

Ой извиняюсь, время с которого начнется обратный отсчет таймера

Livanderiaamarum 13.12.2011 14:25

СУТЬ ТАКОВА)!
есть обьект timer в него передается 2 аргумента
1) время которое нужно отсчитывать
2) функция которая будет выполняться каждую секунду

timer(время, функция);


время передается массивом, часы минуты секунды

[1,15, 42] 1 час 15 минут 42 секунды.

[0,0,10] 0 часов 0 минут 10 секунд.

timer([0,0,10], функция)

в нашу функцию будут передаваться 3 параметра, часы минуты и секунды обратного отсчета. и их можно естественно использовать внутри её.

то есть нужно писать так

timer([0,0,10] , function(часы, минуты, секунды) { alert(часы) } )


обьект timer имеет методы pause() и start()

просто нужно написать

timer.pause() // приостановка
timer.start() // запуск с приостановленного места






function timer(_time, _call){
			timer.lastCall = _call
			timer.lastTime = _time
			timer.timerInterval = setInterval(function(){
						_call(_time[0],_time[1],_time[2]);
						_time[2]--
						if(_time[0]==0 && _time[1]==0 && _time[2]==0){
									timer.pause()
									_call(0,0,0);
						}
						if(_time[2]==0){
									_time[2] = 59
									_time[1]--
									if(_time[1]==0){
												_time[1] = 59
												_time[0]--
									}
						}
						timer.lastTime = _time
			}, 1000)
}
timer.pause = function(){
			clearInterval(timer.timerInterval)
}
timer.start = function(){
			timer(timer.lastTime, timer.lastCall)
}

//сверху мое, а тут уже ваше)
//тут мы начинаем таймер. передаем массив с временем и функцию которая будет вызываться каждую секунду
timer([0,0,7], function(h,m,s){
			alert(h + ':' +m + ':' +s) // алертнуть часы минуты и секунды
})

timer.pause()
timer.start()

kuzkuz 13.12.2011 14:42

Цитата:

Сообщение от Livanderiaamarum (Сообщение 142467)
СУТЬ ТАКОВА)!
есть обьект timer в него передается 2 аргумента
1) время которое нужно отсчитывать
2) функция которая будет выполняться каждую секунду

timer(время, функция);


время передается массивом, часы минуты секунды

[1,15, 42] 1 час 15 минут 42 секунды.

[0,0,10] 0 часов 0 минут 10 секунд.

timer([0,0,10], функция)

в нашу функцию будут передаваться 3 параметра, часы минуты и секунды обратного отсчета. и их можно естественно использовать внутри её.

то есть нужно писать так

timer([0,0,10] , function(часы, минуты, секунды) { alert(часы) } )


обьект timer имеет методы pause() и start()

просто нужно написать

timer.pause() // приостановка
timer.start() // запуск с приостановленного места






function timer(_time, _call){
			timer.lastCall = _call
			timer.lastTime = _time
			timer.timerInterval = setInterval(function(){
						_call(_time[0],_time[1],_time[2]);
						_time[2]--
						if(_time[0]==0 && _time[1]==0 && _time[2]==0){
									timer.pause()
									_call(0,0,0);
						}
						if(_time[2]==0){
									_time[2] = 59
									_time[1]--
									if(_time[1]==0){
												_time[1] = 59
												_time[0]--
									}
						}
						timer.lastTime = _time
			}, 1000)
}
timer.pause = function(){
			clearInterval(timer.timerInterval)
}
timer.start = function(){
			timer(timer.lastTime, timer.lastCall)
}

//сверху мое, а тут уже ваше)
//тут мы начинаем таймер. передаем массив с временем и функцию которая будет вызываться каждую секунду
timer([0,0,7], function(h,m,s){
			alert(h + ':' +m + ':' +s) // алертнуть часы минуты и секунды
})

timer.pause()
timer.start()

Отлично, спасибо ОГРОМНОЕ, в принципе все понятно!
Чтобы вывести время например в <input> Что мне необходимо сделать(ну или в div)

Для вывзова функции остановки и запуска таймера мне достаточно в свойстве кнопки указать <input onclick="timer.pause()" type="button" /> ?

nerv_ 13.12.2011 14:50

Тоже сделал вариант. В связи с чем вопрос: я задаю время в миллисекундах (30 сек), т.е. по идее должно отображаться только 30 сек. Откуда там 3 часа берется?)))

p.s.: с датой работаю буквально второй раз :)
<html>
	<head>
		<meta charset="utf-8">
		<style type="text/css">
		</style>
		<script type="text/javascript">
			var x = new Date().getTime() + 30000;

			function backTimer() {
				var j = document.getElementsByTagName('div')[0];
				var i = new Date().getTime();
				if(i < x) {
					j.innerHTML = new Date(x - i).toLocaleTimeString();
					setTimeout(backTimer, 500);
				} else {
					j.innerHTML = "00:00:00";
				}
			}
		</script>
	</head>
	<body onload="backTimer();">
		<div></div>
	</body>
</html>

Livanderiaamarum 13.12.2011 14:51

Цитата:

Сообщение от kuzkuz (Сообщение 142469)
Отлично, спасибо ОГРОМНОЕ, в принципе все понятно!
Чтобы вывести время например в <input> Что мне необходимо сделать(ну или в div)

Для вывзова функции остановки и запуска таймера мне достаточно в свойстве кнопки указать <input onclick="timer.pause()" type="button" /> ?

да) конечно) попробуйте все)) разберетесь)

timer([0,0,30], function(h,m,s){
   //вот тут время у тебя доступно как
   //h - часы
   //m - минуты
   //s - секунды
})

Nekromancer 13.12.2011 16:58

nerv_,
Потому, что у тебя видимо локальное время +3 стоит, у меня вот +4 и у меня 4 часа показываться)

Nekromancer 13.12.2011 16:59

Livanderiaamarum,
Я бы не стал работать с вами и вашим кодом, он не читабелен вообще и от этого ужасен. Пусть даже возможно и правильный.

Magneto 13.12.2011 17:26

Солидарен с Nekromancer.

Livanderiaamarum 13.12.2011 18:08

Цитата:

Сообщение от Nekromancer (Сообщение 142504)
Livanderiaamarum,
Я бы не стал работать с вами и вашим кодом, он не читабелен вообще и от этого ужасен. Пусть даже возможно и правильный.

вы где-то видели мой код О_О??? когда успели?
п.с. аа ну да. у нас же разные уровни)) в том примере я не обьяснял человеку как нужно сделать. а сделал самый оптимальный и гибкий вариант) и дал ему интерфейс. Вам естественно ничего не понятно) вы же не понимаете как устроен этот паттерн. советую подтянуть ваш javascript чтобы работать со мной на одном уровне)

trikadin 13.12.2011 18:21

Цитата:

Сообщение от Livanderiaamarum
советую подтянуть ваш javascript чтобы работать со мной на одном уровне)

Судя, например, по этому, до вашего уровня нам придётся деградировать. ;)

Livanderiaamarum 13.12.2011 18:26

Цитата:

Сообщение от trikadin (Сообщение 142534)
Судя, например, по этому, до вашего уровня нам придётся деградировать. ;)


но ведь там знание событий браузеров, а тут javascript/ связь?

аа, вы как я понимаю только браузерный js учили с детства))? только сайтики клепать способны да)? наверное каждый косяк ИЕ выучили)? это похвально)
даже наверное не знаете что js бывает не только в браузерах)? да о чем я говорю. не тот уровень)

Aetae 13.12.2011 18:34

Ребята давайте не будем кормить троля. Этот конечно потоньше чем некоторые но всё же.)

Livanderiaamarum 13.12.2011 18:42

Цитата:

Сообщение от Aetae (Сообщение 142536)
Ребята давайте не будем кормить троля. Этот конечно потоньше чем некоторые но всё же.)

некоторые? такие как ты О_О ?

nerv_ 14.12.2011 18:56

Вроде как слепил. Для начала обычный таймер
<html>
	<head>
		<meta charset="utf-8">
		<style type="text/css">
			body { background-color:#ffcc33; margin:0px; }
			div { color:#0033cc; font:bold 12pt Tahoma; margin:15px; }
		</style>
		<script type="text/javascript">
			var Timer = (function() {
				var now, tm, offset = 0, i = 0;
				return function() {
					switch(arguments[0]) {
						case true:
							if(offset === 0) {
								now = new Date();
								offset = now.getTimezoneOffset() * 60000;
							}
							else {
								return ;
							}
							break;
						case false:
							if(offset !== 0) {
								clearTimeout(arguments.callee);
								i = tm.getTime() - offset;
								offset = 0;
							}
					}
					if(offset !== 0) {
						tm = new Date((new Date()).getTime() - now.getTime() + offset + i);
						document.getElementsByTagName('div')[0].innerHTML = tm.toLocaleTimeString();
						setTimeout(arguments.callee, 500);
					}
				}
			})();
		</script>
	</head>
	<body>
		<input type="button" onclick="Timer(true)" value="Start">
		<input type="button" onclick="Timer(false);" value="Pause">
		<div>Div HTML</div>
	</body>
</html>

nerv_ 14.12.2011 20:31

Обратный таймер. Наверное можно сделать проще, но у меня получилось так :)
//в этой строке время выставляется в часах(0), минутах(0), секундах(30) и миллисекундах(0)
var x = (0 * 3600000) + (0 * 60000) + (30 * 1000) + 0;

<html>
	<head>
		<meta charset="utf-8">
		<style type="text/css">
			body { background-color:#ffcc33; margin:0px; }
			div { color:#0033cc; font:bold 12pt Tahoma; margin:15px; }
		</style>
		<script type="text/javascript">
			var backTimer = (function() {
				var x = (0 * 3600000) + (0 * 60000) + (30 * 1000) + 0;
				var now, tm, offset = 0, i = 0;
				return function() {
					switch(arguments[0]) {
						case true:
							if(offset === 0) {
								now = new Date();
								offset = now.getTimezoneOffset() * 60000;
							}
							else {
								return ;
							}
							break;
						case false:
							if(offset !== 0) {
								clearTimeout(arguments.callee);
								i = x - tm.getTime() + offset;
								offset = 0;
							}
					}
					if(offset !== 0) {
						tm = new Date((new Date()).getTime() - now.getTime() + i);
						if(tm.getTime() < x) {
							tm.setTime(x - tm.getTime() + offset);
							document.getElementsByTagName('div')[0].innerHTML = tm.toLocaleTimeString();
							setTimeout(arguments.callee, 500);
						}
						else {
							clearTimeout(arguments.callee);
							tm.setTime(0 + offset);
							document.getElementsByTagName('div')[0].innerHTML = tm.toLocaleTimeString();
							offset = 0;
							i = 0;
						}
					}
				}
			})();
		</script>
	</head>
	<body>
		<input type="button" onclick="backTimer(true)" value="Start">
		<input type="button" onclick="backTimer(false);" value="Pause">
		<div>Div HTML</div>
	</body>
</html>

trikadin 14.12.2011 20:34

Цитата:

Сообщение от nerv_
case true:
                            if(offset === 0) {
                                now = new Date();
                                offset = now.getTimezoneOffset() * 60000;
                            }
                            else {
                                return ;
                            }
                            break;
                        case false:
                            if(offset !== 0) {
                                clearTimeout(arguments.callee);
                                i = x - tm.getTime() + offset;
                                offset = 0;

}

А зачем case? if (arguments[0]) не?

nerv_ 14.12.2011 20:38

trikadin, приветствую) Заодно с конструкцией switch(х) познакомился :)

trikadin 14.12.2011 23:24

Цитата:

Сообщение от nerv_ (Сообщение 142898)
trikadin, приветствую) Заодно с конструкцией switch(х) познакомился :)

Здравствуй)

Знакомство - хорошо, но её использование, на мой взгляд, в данном контексте не очень оправдано...

рони 14.12.2011 23:30

nerv_,
Вариант ...
<html>
	<head>
		<meta charset="utf-8">
		<style type="text/css">
			body { background-color:#ffcc33; margin:0px; }
			div { color:#0033cc; font:bold 12pt Tahoma; margin:15px; }
		</style>
		<script type="text/javascript">
var t = new Date,s,n;
t.setHours(0, 0, 0, 0);
function Timer() {
    t = new Date(t.getTime() + (new Date).getTime() - s.getTime());
    document.getElementsByTagName("div")[0].innerHTML = t.toLocaleTimeString();
    s = new Date;
    n = setTimeout(arguments.callee, 500)
}
function New_start() {
    t.setHours(0, 0, 0, 0);
    s = new Date;
    Timer()
}
function Pause() { 
    s ? (window.clearTimeout(n), s = !1) : (s = new Date, Timer())
};
		</script>
	</head>
	<body>
		<input type="button" onclick="New_start()" value="Start/New">
		<input type="button" onclick="Pause();" value="Pause/Go">
        <div>Div HTML</div>
    </body>
</html>

рони 14.12.2011 23:50

Вариант с прямым или обратным отсчётом ...
<html>
	<head>
		<meta charset="utf-8">
		<style type="text/css">
			body { background-color:#ffcc33; margin:0px; }
			div { color:#0033cc; font:bold 12pt Tahoma; margin:15px; }
		</style>
		<script type="text/javascript">
var t = new Date,f = 1,s,n;
t.setHours(0, 0, 0, 0);
function Timer() {
    t = new Date(t.getTime() + f*((new Date).getTime() - s.getTime()));
    document.getElementsByTagName("div")[0].innerHTML = t.toLocaleTimeString();
    s = new Date;
    n = setTimeout(arguments.callee, 500)
}
function New_start() {
    t.setHours(0, 0, 0, 0);
    s = new Date;
    Timer()
}
function Pause() { 
    s ? (window.clearTimeout(n), s = !1) : (s = new Date, Timer())
};

function BackTimer()
{
   f = -f
}

		</script>
	</head>
	<body>
		<input type="button" onclick="New_start()" value="Start/New">
		<input type="button" onclick="Pause();" value="Pause/Go">
        <input type="button" onclick="BackTimer();" value="BackTimer">
        <div>Div HTML</div>
    </body>
</html>

рони 15.12.2011 00:49

:write:
Вариант с установкой секунд ... )))
<html>
	<head>
		<meta charset="utf-8">
		<style type="text/css">
			body { background-color:#ffcc33; margin:0px; }
			div { color:#0033cc; font:bold 12pt Tahoma; margin:15px; }
		</style>
		<script type="text/javascript">
var t = new Date,f = 1,s,n;
t.setHours(0, 0, 0, 0);
function Timer() {
    t = new Date(t.getTime() + f*((new Date).getTime() - s.getTime()));
    document.getElementsByTagName("div")[0].innerHTML = t.toLocaleTimeString();
    s = new Date;
    n = setTimeout(arguments.callee, 500)
}
function New_start() {
    window.clearTimeout(n);
    t.setHours(0, 0, 0, 0);
    s = new Date;
    Timer()
}
function Pause() { 
    s ? (window.clearTimeout(n), s = !1) : (s = new Date, Timer())
};

function BackTimer()
{
   window.clearTimeout(n);
   f = -f;
   s = new Date;
   Timer()
}

function Set()
{
 var sec = parseInt(document.getElementById("sec").value, 10)||0
 t.setHours(0, 0, sec, 0);
 document.getElementsByTagName("div")[0].innerHTML = t.toLocaleTimeString();

}
		</script>
	</head>
	<body>
		<input type="button" onclick="New_start()" value="Start/New">
		<input type="button" onclick="Pause();" value="Pause/Go">
        <input type="button" onclick="BackTimer();" value="BackTimer">
        <input type="button" onclick="Set();" value="Set">
        <label><input type="text" value="30" id="sec">sec</label>
        <div>Div HTML</div>
    </body>
</html>

Aetae 15.12.2011 01:41

Вариант с прямым и обратным отсчётом, с установкой секунд, минут, часов, дней, недель, месяцев и лет, с сапёром и змейкой, с aero, с функцией gps, со звуками, распознаванием голоса и искусственным интеллектом ... ... и, наконец, с блэкджеком и шлюхами.
/*

щутка))

*/

melky 15.12.2011 01:45

Aetae, и главное, он написан на jquery !

trikadin 15.12.2011 01:51

Цитата:

Сообщение от Aetae
с aero

Выпал) Ахаха) :D

Livanderiaamarum 15.12.2011 01:53

Цитата:

Сообщение от Aetae (Сообщение 143001)
Вариант с прямым и обратным отсчётом, с установкой секунд, минут, часов, дней, недель, месяцев и лет, с сапёром и змейкой, с aero, с функцией gps, со звуками, распознаванием голоса и искусственным интеллектом ... ... и, наконец, с блэкджеком и шлюхами.
/*

щутка))

*/

aero :haha:

могёш)

nerv_ 15.12.2011 10:38

рони, благодарю) Теперь я понял, что делал неправильно -- все :lol: Объясните, пожалуйста, на примере вашей первой функции, как сделать так, чтобы в глобальной области видимости находилась только одна функция, а не кол-во функций + кол-во глобальных переменных?

trikadin 15.12.2011 13:43

Цитата:

Сообщение от nerv_
Объясните, пожалуйста, на примере вашей первой функции, как сделать так, чтобы в глобальной области видимости находилась только одна функция, а не кол-во функций + кол-во глобальных переменных?

Через анонимную ф-цию:

var global, globalMethod; // объявляем глобальные переменные
(function(){ // создаём анонимную ф-цию
var local= 2; // локальная переменная
global= 3;
globalMethod= function() {
 alert(local + " + " + global + " = " + (local+global));
};
})() // вызываем анонимную ф-цию
globalMethod();
alert(local);

nerv_ 15.12.2011 17:26

trikadin, очередное мерси :yes: Вроде как пример простой и на первый взгляд понятный, но я все равно пару раз прогнал его в отладчике пошагово, чтобы в голове отложилось :) Кажется, понял, почему у меня не получалось) Если не ошибаюсь, тут используется т.н. "статическая приватная" переменная благодаря замыканию анонимной ф-ции на globalMethod.

trikadin 15.12.2011 17:30

Полезно будет почитать про фабрики объектов - суть примерно та же.

рони 16.12.2011 07:14

Цитата:

Сообщение от nerv_
Объясните, пожалуйста, на примере вашей первой функции, как сделать так, чтобы в глобальной области видимости находилась только одна функция, а не кол-во функций + кол-во глобальных переменных?

Вариант всё тоже самое но все переменные и функции в одном обьекте ...
<html>
	<head>
		<meta charset="utf-8">
		<style type="text/css">
			body { background-color:#ffcc33; margin:0px; }
			div { color:#0033cc; font:bold 12pt Tahoma; margin:15px; }
		</style>
		<script type="text/javascript">
  var T = {
    n: null,
    s: new Date,
    f: 1,
    t: new Date,
    Timer: function () {
        T.t = new Date(T.t.getTime() + T.f * ((new Date).getTime() - T.s.getTime()));
        document.getElementsByTagName("div")[0].innerHTML = T.t.toLocaleTimeString();
        T.s = new Date;
        T.n = setTimeout(function () {
            T.Timer()
        }, 500)
    },
    New_start: function () {
        clearTimeout(T.n);
        T.t.setHours(0, 0, 0, 0);
        T.s = new Date;
        T.Timer()
    },
    Pause: function () {
        T.s ? (clearTimeout(T.n), T.s = "") : (T.s = new Date, T.Timer())
    },
    BackTimer: function () {
        clearTimeout(T.n);
        T.f = -T.f;
        T.s = new Date;
        T.Timer()
    },
    Set: function () {
        var a = parseInt(document.getElementById("sec").value, 10) || 0;
        T.t.setHours(0, 0, a, 0);
        document.getElementsByTagName("div")[0].innerHTML = T.t.toLocaleTimeString()
    }
};
		</script>
	</head>
	<body>
		<input type="button" onclick="T['New_start']()" value="Start/New">
		<input type="button" onclick="T['Pause']()" value="Pause/Go">
        <input type="button" onclick="T['BackTimer']();" value="BackTimer">
        <input type="button" onclick="T['Set']();" value="Set">
        <label><input type="text" value="30" id="sec">sec</label>
        <div>Div HTML</div>
    </body>
</html>

Livanderiaamarum 16.12.2011 07:59

я ща спать, а завтра сделаю самый лучший таймер из всех возможных))

Solovei95 16.12.2011 08:03

Это невозможно! Нужно тогда брать конкретное время, и отсчитывать.

trikadin 16.12.2011 14:38

Цитата:

Сообщение от Solovei95
Это невозможно! Нужно тогда брать конкретное время, и отсчитывать.

Что невозможно-то? Тут уже всё сделали)

nerv_ 16.12.2011 15:34

рони, благодарю! :yes: Разрешите полюбопытствовать, почему Вы обращаетесь к методам этим способом
<input type="button" onclick="T['New_start']()" value="Start/New">
// а не этим?
<input type="button" onclick="T.New_start();" value="Start/New">

Livanderiaamarum 16.12.2011 15:51

Цитата:

Сообщение от nerv_ (Сообщение 143436)
рони, благодарю! :yes: Разрешите полюбопытствовать, почему Вы обращаетесь к методам этим способом
<input type="button" onclick="T['New_start']()" value="Start/New">
// а не этим?
<input type="button" onclick="T.New_start();" value="Start/New">

привычка наверное))

trikadin 16.12.2011 15:53

Цитата:

Сообщение от Livanderiaamarum
привычка наверное))

Ну, так ещё делается для борьбы с обфускацией названий методов. Хотя в атрибуте это неоправданно,имхо.


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