Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.09.2011, 04:02
Аватар для systemiv
Профессор
Отправить личное сообщение для systemiv Посмотреть профиль Найти все сообщения от systemiv
 
Регистрация: 19.08.2011
Сообщений: 186

Таймер на 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, 24.09.2011 в 07:39.
Ответить с цитированием
  #2 (permalink)  
Старый 26.09.2011, 09:24
Аватар для systemiv
Профессор
Отправить личное сообщение для systemiv Посмотреть профиль Найти все сообщения от systemiv
 
Регистрация: 19.08.2011
Сообщений: 186

Написал вот такую функцию. Работает нормально, но хотелось бы уменьшить её объём
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]];  
}
Ответить с цитированием
  #3 (permalink)  
Старый 26.09.2011, 12:11
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от systemiv Посмотреть сообщение
хотелось бы уменьшить её объём
Привычки php или ты косишь под архиватор?

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


все var вынести вверх функции.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #4 (permalink)  
Старый 26.09.2011, 12:17
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от systemiv Посмотреть сообщение
var minuteRes = hourRes % 60;
		var second = minuteRes;
Смысл в студию пожалуйста!

var second = hourRes % 60;

Я не проверяю правильность твоих вычислений, но зачем нужна minuteRes?
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #5 (permalink)  
Старый 26.09.2011, 13:09
Аватар для systemiv
Профессор
Отправить личное сообщение для systemiv Посмотреть профиль Найти все сообщения от systemiv
 
Регистрация: 19.08.2011
Сообщений: 186

Сообщение от Gozar Посмотреть сообщение

все var вынести вверх функции.
Если я из вынесу в верх функции, то это сильно затормозит работу. Пока все вычисления проходят когда это возможно, но зачем делать когда это не нужно?
Ответить с цитированием
  #6 (permalink)  
Старый 26.09.2011, 14:07
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

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

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

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

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

Сообщение от Gozar Посмотреть сообщение
Смысл в студию пожалуйста!

var second = hourRes % 60;

Я не проверяю правильность твоих вычислений, но зачем нужна minuteRes?
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #7 (permalink)  
Старый 26.09.2011, 15:59
Аватар для systemiv
Профессор
Отправить личное сообщение для systemiv Посмотреть профиль Найти все сообщения от systemiv
 
Регистрация: 19.08.2011
Сообщений: 186

Сообщение от Gozar
Во вторых, зачем оптимизировать функцию, которая использоваться второй раз никогда не будет?
Там же в коде написано:
setTimeout(updateTimer, 1000);

+ таких счётчиков будет около 10.
Это серьёзно повлияет на производительность
Ответить с цитированием
  #8 (permalink)  
Старый 26.09.2011, 16:25
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

10 таймеров по одной секунде никак не повлияют на производительность.
Ответить с цитированием
  #9 (permalink)  
Старый 29.09.2011, 03:25
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

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

Сообщение от Gozar
все var вынести вверх функции.
а вот здесь против, раз, два (анг.)
Ответить с цитированием
  #10 (permalink)  
Старый 29.06.2013, 19:17
Интересующийся
Отправить личное сообщение для Aeliot Посмотреть профиль Найти все сообщения от Aeliot
 
Регистрация: 18.05.2013
Сообщений: 22

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Картинка обрабатывается js 4yBaK Общие вопросы Javascript 10 11.09.2011 09:28
Срочно JS developer okp Работа 13 23.08.2011 16:16
js отслеживание активной вкладки браузера okapo Javascript под браузер 3 17.04.2011 15:55
Не получается передать переменную из JS в PHP Lion_astana AJAX и COMET 2 23.11.2010 17:23
помогите задать переменную в js bsgroupua Общие вопросы Javascript 3 01.02.2010 18:28