X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> [JS] заставить таймер "идти" по кругу
scanread
scanread
Topic Starter сообщение 26.4.2013, 20:02; Ответить: scanread
Сообщение #1


ДЕТАЛИ В ПРОФИЛЕ
******

Группа: Active User
Сообщений: 1005
Регистрация: 16.12.2009
Поблагодарили: 178 раз
Репутация:   54  


Кто может, помогите, пожалуйста, запустить таймер по кругу:

function TRT ()
{
var delta = 4; // GMP
var txt = 'Надпись...';

if (self.TMR) clearTimeout (TMR);
var d = new Date, m = d.getUTCMinutes (), h = d.getUTCHours () + delta;
if (h > 24) h -= 24;
if ((h == 21 && m >= 30) || (h == 21 && m < 40))
   document.getElementById ('trv').innerHTML = txt;
else
   {
   var t2130 = 21 * 60 + 30, tnow = h * 60 + m, t = t2130 - tnow;
   if (t < 0) t = t2130 + 24 * 60 - tnow;
   var rh = Math.floor (t / 60), rm = t - rh * 60;
   var a0 = function (x) {return (x < 10 ? '0' : '') + x}
   document.getElementById ('trv').innerHTML = a0 (rh) + ':' + a0 (rm);
   TMR = setTimeout (TRT, 30 * 1000);
   }
}
</script>


<span id="trv"></span><script>TRT ()</script>


Суть такова: при достижении времени равному 21:30 вывести "Надпись...", потом, по истечению 10 минут считать по новой 23 часа 50 минут. Сейчас выходит, он доходит до 21:30, выводит надпись, и через 10 минут снова не идет...

Заранее благодарю.

Сообщение отредактировал scanread - 26.4.2013, 20:04


--------------------
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
tszyan
tszyan
сообщение 26.4.2013, 20:39; Ответить: tszyan
Сообщение #2


Участник
***

Группа: User
Сообщений: 207
Регистрация: 28.1.2013
Из: Москва
Поблагодарили: 110 раз
Репутация:   27  


scanread,
Что-то в коде ереси много...
<span id="label"></span>

$(function(){
    setInterval(function(){
        var date = new Date();
        var h = date.getHours();
        var m = date.getMinutes();
        if ( h == 21 && m > 30 && m < 40){
            $('#label').text('Text...');
        } else {
            $('#label').text('');
        }
    }, 30*1000);
});


Если нужна точность больше 30 сек, то можно поставить более короткий интервал.
30*1000


Или извратиться и при запуске определить сколько сейчас секунд, затем установить таймер (setTimeout) на количество секунд оставшееся до 00 секунд. И уже в этом таймере запустить setInterval с периодичностью 60*1000.

Или при запуске посчитать сколько осталось до 21.30 и запустить таймер с оставшимся временем, а внутри него setInterval с периодичностью в сутки. И второй таймер но уже на 21.40. Один будет показывать надпись, другой прятать.

Сообщение отредактировал tszyan - 26.4.2013, 20:45
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
scanread
scanread
Topic Starter сообщение 26.4.2013, 21:02; Ответить: scanread
Сообщение #3


ДЕТАЛИ В ПРОФИЛЕ
******

Группа: Active User
Сообщений: 1005
Регистрация: 16.12.2009
Поблагодарили: 178 раз
Репутация:   54  


tszyan, да в коде как раз то что надо, поскольку учитывается время по РФ, как и нужно, а не по тому, как у меня в Украине.

else {
            $('#label').text('');
        }


таймер нужен чтобы шел дальше, а не пустая строка)


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
artanik
artanik
сообщение 26.4.2013, 22:39; Ответить: artanik
Сообщение #4


Участник
***

Группа: User
Сообщений: 225
Регистрация: 3.5.2011
Из: Украина, Львов
Поблагодарили: 147 раз
Репутация:   47  


Ошибка в условии
if ((h == 21 && m >= 30) || (h == 21 && m < 40))

Нужно вместо логического ИЛИ указать логическое И
if ((h == 21 && m >= 30) && (h == 21 && m < 40))

Через минуту будет время, а не надпись http://jsbin.com/ifodad/1


--------------------
Мой промо-сайт

Нужна качественная вёрстка сайтов? Обращайтесь: ICQ 555-177-362 


Поблагодарили: (2)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
rjksdfhe
rjksdfhe
сообщение 27.4.2013, 0:03; Ответить: rjksdfhe
Сообщение #5


Straight arms
*******

Группа: Active User
Сообщений: 2760
Регистрация: 21.4.2009
Из: Мытищи, МО, РФ
Поблагодарили: 1111 раз
Репутация:   163  


artanik прав, на самом деле условие неправильное, т.е. всегда при h=21 оно true.
Неправильно обрабатывался период с 21:00.00 по 21:59.60.

Дальше, что будет после 22:00.00 копать не стал, заморочено и не интересно.

А по комментарию tszyan тоже согласен, что очень заморочено.
И надо бы уже понимать, что время по MSK (что хочется) от его примера (время по юзеру) отличается только функциями класса Date:

date.getHours();
date.getMinutes();

vs

d.getUTCMinutes()
d.getUTCHours ()

Сообщение отредактировал rjksdfhe - 26.4.2013, 23:58


Поблагодарили: (2)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
tszyan
tszyan
сообщение 27.4.2013, 0:54; Ответить: tszyan
Сообщение #6


Участник
***

Группа: User
Сообщений: 207
Регистрация: 28.1.2013
Из: Москва
Поблагодарили: 110 раз
Репутация:   27  


(scanread @ 26.4.2013, 21:02) *
tszyan, да в коде как раз то что надо, поскольку учитывается время по РФ, как и нужно, а не по тому, как у меня в Украине.

Извиняюсь, из "ТЗ" это было непонятно wink.gif Но про ересь я слов обратно не возьму! tongue.gif

Тогда так.

function pad(n){
    return n > 9 ? n : '0' + n;
}

$(function(){
    setInterval(function(){
        var date = new Date();
        date.setHours(date.getHours() + 4, date.getMinutes() + date.getTimezoneOffset());
        var h = date.getHours();
        var m = date.getMinutes();
        if ( h == 21 && m >= 30 && m < 40){
            $('#label').text('Text...');
        } else {
            $('#label').text(pad(h) + ':' + pad(m));
        }
    }, 30*1000);
});


Избегаем:
if (h > 24) h -= 24;

и прочей непонятной математики с временем.

if ((h == 21 && m >= 30) && (h == 21 && m < 40))

artanik, два раза проверять h - это лишнее, но в целом замечание верное...
а я то даже не думал проверять условия, просто с нуля написал =)

Сообщение отредактировал tszyan - 27.4.2013, 1:07
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
scanread
scanread
Topic Starter сообщение 27.4.2013, 2:24; Ответить: scanread
Сообщение #7


ДЕТАЛИ В ПРОФИЛЕ
******

Группа: Active User
Сообщений: 1005
Регистрация: 16.12.2009
Поблагодарили: 178 раз
Репутация:   54  


tszyan, хм, а чего он считает вперед, а не обратно? tongue.gif


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
tszyan
tszyan
сообщение 27.4.2013, 8:20; Ответить: tszyan
Сообщение #8


Участник
***

Группа: User
Сообщений: 207
Регистрация: 28.1.2013
Из: Москва
Поблагодарили: 110 раз
Репутация:   27  


scanread,
Видимо ТЗ совсем некудышное. Если Вы по-прежнему отстаиваете математику, то вот:
function pad(n){
    return n > 9 ? n : '0' + n;
}

$(function(){
    setInterval(function(){
        var date = new Date();
        date.setHours(date.getHours() + 4, date.getMinutes() + date.getTimezoneOffset());
        var h = date.getHours();
        var m = date.getMinutes();
        if ( h == 21 && m >= 30 && m < 40){
            $('#label').text('Text...');
        } else {
            var countdown = new Date();
            countdown.setHours(21 - h , 30 - m);
            $('#label').text(pad(countdown.getHours()) + ':' + pad(countdown.getMinutes()));
        }
    }, 3*1000);
});


Код должен быть читабельным и понятным. Ну... хороший код.
Это, конечно, если мы не говорим про защиту, минификацию и обфускацию.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
scanread
scanread
Topic Starter сообщение 27.4.2013, 13:12; Ответить: scanread
Сообщение #9


ДЕТАЛИ В ПРОФИЛЕ
******

Группа: Active User
Сообщений: 1005
Регистрация: 16.12.2009
Поблагодарили: 178 раз
Репутация:   54  


(tszyan @ 27.4.2013, 7:20) *
Видимо ТЗ совсем некудышное

Согласен)

Еще вопрос, можно как-то вставить звук какой-то для проигрывания при достижении нужного времени if ( h == 21 && m >= 30 && m < 40)? Искал в инете как в JS подключить, ничего нету, рекомендуют везде юзать флеш для кроссбраузерности, который, к несчастью, пока не подходит для решения. Хотя бы какой простой звук "пилик-пилик" (как системный в виндовс).


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
artanik
artanik
сообщение 27.4.2013, 13:28; Ответить: artanik
Сообщение #10


Участник
***

Группа: User
Сообщений: 225
Регистрация: 3.5.2011
Из: Украина, Львов
Поблагодарили: 147 раз
Репутация:   47  


Недавно воспроизводил звуки на HTML5, если подойдёт такой вариант(по кроссбраузерности), то вот код:
<audio id="audio"></audio>
<script>
if ( h == 21 && m >= 30 && m < 40) {

    var audio = document.getElementById('audio');
    
    var canPlayType = audio.canPlayType("audio/ogg");

    if(canPlayType.match(/maybe|probably/i)) {
        audio.src = 'source/bg_cover.ogg';//FireFox
    } else {
        audio.src = 'source/bg_cover.mp3';//Chrome, Safari, Opera
    }

    if(typeof HTMLAudioElement == 'object' || typeof HTMLAudioElement == 'function') {
        audio.play();
    }
    
}
</script>


Сообщение отредактировал artanik - 27.4.2013, 13:31


--------------------
Мой промо-сайт

Нужна качественная вёрстка сайтов? Обращайтесь: ICQ 555-177-362 
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Новости mail.ru появятся в "рекомендациях" Вконтакте?
19 eduarddis 2773 12.12.2017, 20:37
автор: galikfor
Горячая тема (нет новых ответов) Как заставить Google любить тебя?
Хочу роста трафа из Гугла : ))
73 Aslan88 16327 12.12.2017, 14:48
автор: coremission
Открытая тема (нет новых ответов) Имеет ли смысл такое "присоединение сайтов"?
перенести все статьи на свой сайт, а с прежнего поставить 301 редирект
9 coremission 1084 11.12.2017, 16:32
автор: One_on_One
Открытая тема (нет новых ответов) Переводчик по тематике "Арбитраж трафика, партнерки и т.п." на постоянную основу
1 kuprum 362 9.12.2017, 17:02
автор: pishu-text
Открытая тема (нет новых ответов) Куплю "вечные URL" с ваших сайтов с тематикой - Пластиковые Окна!
0 regem 448 5.12.2017, 3:47
автор: regem


 



RSS Текстовая версия Сейчас: 14.12.2017, 19:20
Дизайн