Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Таймер на JS (https://javascript.ru/forum/misc/21786-tajjmer-na-js.html)

systemiv 24.09.2011 04:02

Таймер на JS
 
Идея такова:
У меня на странице должно быть много таймеров обратного отсчёта.
Php отдаёт timestamp для каждого поля.
Нужно из полученного времени, вычесть время которое сейчас(это всё в секундах) и получившиеся секунды преобразовать в вольный формат. Например Осталось: 5 дней 7 часов 55 минут 35 секунд
Вопрос в том, существует ли где ни будь скрипт или библиотека?
Которая содержит функцию, в которую можно передать именно ТАЙМШТАМП, и что бы у неё были доступны геттеры(дней, часов, минут, секунд).
Дальше я планирую просто через интервал декриминировать поле и всё.

Добавлено:
Уже утро, сижу никакой и бац, в голову алгоритм)
var warTime = element.innerHTML;
    var nowTime = Math.round(new Date().getTime() / 1000);

    var day = Math.ceil((warTime - nowTime) / 86400);
    var dayRes = (warTime - nowTime) % 86400;

    var hour = Math.ceil(dayRes / 3600);
    var hourRes = dayRes % 3600;

    var minute = Math.ceil(hourRes / 60);
    var minuteRes = hourRes % 60;

    var second = Math.ceil(minuteRes / 60);
    element.innerHTML = 'Дней: ' + day + 'Часов:' + hour + 'Минут:' + minute + 'Секунд:' + second;

Немного костыль, нужно несколько проверок, но всё равно пишите если Вы знаете метод получше)

systemiv 26.09.2011 09:24

Написал вот такую функцию. Работает нормально, но хотелось бы уменьшить её объём
function updateTimer(warTime){
	var nowTime = Math.round(new Date().getTime() / 1000);
	if(warTime < nowTime){
		element.innerHTML = 'Голосование закончено.';
	}else{
		var day = Math.ceil((warTime - nowTime) / 86400);
		var dayRes = (warTime - nowTime) % 86400;
		if(day < 10) day = '0' + day;

		var hour = Math.ceil(dayRes / 3600);
		var hourRes = dayRes % 3600;
		if(hour < 10) hour = '0' + hour;

		var minute = Math.ceil(hourRes / 60);
		var minuteRes = hourRes % 60;
		if(minute < 10) minute = '0' + minute;

		var second = minuteRes;
		if(second < 10) second = '0' + second;

		element.innerHTML = 'Осталось: ' + day + declOfNum(day, [' День ', ' Дня ', ' Дней ']);
		element.innerHTML += hour +  declOfNum(hour, [' Час ', ' Часа ', ' Часов ']);
		element.innerHTML += minute +  declOfNum(minute, [' Минута ', ' Минуты ', ' Минут ']);
		element.innerHTML += second +  declOfNum(second, [' Секунда ', ' Секунды ', ' Секунд ']);
	}
	warTime--;
	setTimeout(updateTimer, 1000);
}

function declOfNum(number, titles){  
	cases = [2, 0, 1, 1, 1, 2];  
	return titles[(number % 100 > 4 && number % 100 < 20) ? 2 : cases[(number % 10 < 5) ? number % 10 : 5]];  
}

Gozar 26.09.2011 12:11

Цитата:

Сообщение от systemiv (Сообщение 128087)
хотелось бы уменьшить её объём

Привычки php или ты косишь под архиватор?

Во первых я против отсутствия скобок у конструкции if, во вторых html собирать проще не +=, а
element.innerHTML = [ 
'строка html', 
'ещё строка html' 
].join("");


все var вынести вверх функции.

Gozar 26.09.2011 12:17

Цитата:

Сообщение от systemiv (Сообщение 128087)
var minuteRes = hourRes % 60;
		var second = minuteRes;

Смысл в студию пожалуйста!

var second = hourRes % 60;

Я не проверяю правильность твоих вычислений, но зачем нужна minuteRes?

systemiv 26.09.2011 13:09

Цитата:

Сообщение от Gozar (Сообщение 128098)

все var вынести вверх функции.

Если я из вынесу в верх функции, то это сильно затормозит работу. Пока все вычисления проходят когда это возможно, но зачем делать когда это не нужно?

Gozar 26.09.2011 14:07

Цитата:

Сообщение от systemiv (Сообщение 128115)
Если я из вынесу в верх функции, то это сильно затормозит работу. Пока все вычисления проходят когда это возможно, но зачем делать когда это не нужно?

Где я предлагал делать расчеты вверху?

Также я пришел к выводу что var по возможности должно быть одно, вверху. Хороший тон так сказать. Позволяет понять сразу общую картину.

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

Прогони через компрессор и получишь укороченную версию.

Цитата:

Сообщение от Gozar (Сообщение 128100)
Смысл в студию пожалуйста!

var second = hourRes % 60;

Я не проверяю правильность твоих вычислений, но зачем нужна minuteRes?


systemiv 26.09.2011 15:59

Цитата:

Сообщение от Gozar
Во вторых, зачем оптимизировать функцию, которая использоваться второй раз никогда не будет?

Там же в коде написано:
setTimeout(updateTimer, 1000);

+ таких счётчиков будет около 10.
Это серьёзно повлияет на производительность

Kolyaj 26.09.2011 16:25

10 таймеров по одной секунде никак не повлияют на производительность.

x-yuri 29.09.2011 03:25

Цитата:

Сообщение от Gozar
Во первых я против отсутствия скобок у конструкции if,

я не против, но так проще :)

Цитата:

Сообщение от Gozar
все var вынести вверх функции.

а вот здесь против, раз, два (анг.)

Aeliot 29.06.2013 19:17

А как вы их прикрутили? Можно посмотреть html код?


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