Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Написал часики для обратного отсчета. Подскажите где слажал (https://javascript.ru/forum/misc/12000-napisal-chasiki-dlya-obratnogo-otscheta-podskazhite-gde-slazhal.html)

t0xas 25.09.2010 11:52

Написал часики для обратного отсчета. Подскажите где слажал
 
$(document).ready(function(){                          // по завершению загрузки страницы
        getTimer();
function getTimer(){
        var day =$("span#day").text();
        var sec =$("span#sec").text();
        var minu =$("span#min").text();
         var hour =$("span#hour").text();
        if(day == 0  && hour == 0 && minu == 0 && (sec == 0 || sec == 1))
      sec  = 0;
        else
            sec--;
        if(sec == 0 ){
                     if(day == 0  && hour == 0 && (minu == 0 || minu == 1)){
                         minu=0;
                         sec = 0;
                    }
                     else{
                          minu -- ;
                         sec = 60
                     }
            }
            if(minu == 0){
                     if(day == 0  && hour == 0){
                          hour = 0 ;
                        minu =0;
                     }
                     else{
                       hour --;
                         minu = 60;
                     }
            }
            if(hour == 0){
               if(day != 0){
                day --;
                hour = 23;
              }
            }
            if(day == 0) {
                day = 0;
                if(hour == 0){
                    hour =0;
                    if(minu==0)
                    {
                        minu =0;
                        if(sec ==0){
                            sec =0;
                        }
                    }
                }
            }

            $("span#day").text(day);
            $("span#sec").text(sec);
            $("span#min").text(minu);
            $("span#hour").text(hour);
            setTimeout(getTimer, 1000);
}
 });
    </script>

не нравиться мне что 60 у меня вылетает при работе а не 59, а догнать по логике не могу. Мне кажется ваще код превратился в фарш:( и много лишнего. но я путаться начал жутко. Посоветуйте как оптимизироватью

Kolyaj 25.09.2010 12:36

Цитата:

Сообщение от t0xas
if(day == 0) {
    day = 0;
    if(hour == 0){
        hour =0;
            if(minu==0)
            {
                minu =0;
                if(sec ==0){
                    sec =0;
                }
            }
        }
    }
}

А это что за жесть?

with-love-from-siberia 25.09.2010 13:48

Цитата:

Сообщение от t0xas
код превратился в фарш

скорее в спагетти
Формулируйте алгоритм словесно, графически, добейтесь ясности и лаконичности, а потом реализуйте в коде.

оффтопом. Интересно, а блок-схемы сейчас кто-нибудь помнит? Пишут алгоритмы на бумажке или сразу -- в лапшу?

KamaZz 25.09.2010 14:19

Цитата:

Формулируйте алгоритм словесно, графически, добейтесь ясности и лаконичности, а потом реализуйте в коде.
Очень помогает... Но в силу непонятных багов JS'a, сформулировать алгоритм получается только при 2-4 переписи кода...
Посему изначально приходится действовать по принципу Keep It Stupid...

if(day == 0) {
    day = 0;

Если day равно 0, то day равно 0...

with-love-from-siberia 25.09.2010 18:28

Цитата:

Сообщение от KamaZz
в силу непонятных багов JS'a,

Не надо грешить на баги языка. Надо просто сесть и продумать алгоритм.

Эту задачу можно решить двумя способами.

Подсказка 1:
Видимо автор желает, чтобы таймер работал так (часы-минуты-секунды):
01:01:01
01:01:00
01:00:59
...
01:00:02
01:00:01
01:00:00
00:59:59

Посмотрите на пример и найдите закономерность.

Подсказка 2:
Сколько секунд в днях-часах-минутах? Как можно отнять одну секунду из дней-часов-минут-секунд?

KamaZz 25.09.2010 19:30

Продумать алгоритм?
Пройдитесь пожалуйста в соседнюю темку "Вывод значения onclick", разве там проблема в алгоритме?

t0xas 25.09.2010 19:45

Спасибо за советы

Оцените новый вариант. Ничего умнее не придумал как вставить стоп сигналы в иф.
<script type="text/javascript">
    $(document).ready(function(){                          // по завершению загрузки страницы
        getTimer();
    function getTimer(){
        var day =$("span#day").html();
        var sec =$("span#sec").html();
        var minu =$("span#min").html();
        var hour =$("span#hour").html();
        var sh=1, sd =1, sm=1, ss =1;
        if(day == 0) sd =0;
        if(day == 0 && hour == 0) sh =0;
        if(sh == 0 && minu ==0) sm = 0;
        if(sm == 0 && sec == 0) ss = 0;
        if(ss != 0){
            sec--;
            if(sec == 0 && sm == 1){
                sec=59;
                minu --;
                if(minu == 0 && sh == 1){
                        minu =59;
                        hour--;
                        if(hour == 0 && sd == 1){
                            hour=23;
                            day--;
                        }
                    
                }
            }
        }
        $("span#day").text(day);
        $("span#sec").text(sec);
        $("span#min").text(minu);
        $("span#hour").text(hour);
        setTimeout(getTimer, 1000);
    }
     });
        </script>

KamaZz 25.09.2010 21:23

После тега "[ js]" пиши run = "[ js run]" так удобнее смотреть, имхо.
Но тогда нужно и html теги к которым ты обращаешься, писать...

Я конечно не гуру, но зачем каждую миллисекунду обновлять?
setTimeout(getTimer, 1);

t0xas 25.09.2010 21:47

а это для теста ) извиняюсь, забыл сменить.

with-love-from-siberia 25.09.2010 22:16

Ойтыжхоспади... Сложить все, вычесть единицу и снова расложить по отдельным элементам не можете...

А в начальной школе вычитанию столбиком учились? Или пропустили? Иэээх... Думать совсем разучились.

Догадаетесь куда и вместо чего это вставить?
...
// все - отчет закончен, выходим и больше ничего не делаем
if ( s == 0 && m == 0 && h == 0 && d == 0 ) {
	return;
}

// вычитаем одну секунду
s--;

// когда все секунды кончились занимаем у минут
if ( s < 0 ) {
	s = 59;
	m--;
}

// когда и минуты кончились - занимаем у часов
if ( m < 0 ) {
	m = 59;
	h--;
}

// а потом у дней
if ( h < 0 ) {
	h = 23;
	d--;
}

// проверяем чтобы дни не были отрицательными
if ( d < 0 ) {
	d = 0;
}

mrspd 26.09.2010 10:06

Вас всех тут на говнокод можно отправить смело. Если таймер, так и работать надо со временем!

var timer = new Object();
timer.get = function (year,month,day,hour,minute,second,msecond){
    
    var finish_time = new Date(year,month-1,day,hour,minute,second,msecond);    
    var start_time     = new Date();
    var diff = Math.round((finish_time.getTime() - start_time.getTime())/1000);
        
    timer.seconds     = diff % 60;
    timer.minutes     = Math.floor((diff/60) % 60);
    timer.hours       = Math.floor((diff/3600) % 24);
    timer.days       = Math.floor(diff/3600/24);
    
    console.log('Дней: '+timer.days+' - Часов: '+timer.hours+' - Минут:'+timer.minutes+' - Секунд:'+timer.seconds);
    setTimeout(function ()
    {
        timer.get(year,month,day,hour,minute,second,msecond);
    },1000);
}

// До конца света осталось
timer.get(2012,1,1,0,0,0,0);

with-love-from-siberia 26.09.2010 11:13

mrspd, не умничайте. Ваш пример, по сути, - модификация алгоритма, словесно описанного вот этой строкой
Цитата:

Сообщение от with-love-from-siberia
Сложить все, вычесть единицу и снова расложить по отдельным элементам

. Проблема в том, что некоторое начальное значение может формироваться на стороне сервера. Естественно, что должно быть создана переменная типа Date, а потом с ней уже работать. Но в данном случае, с моей стороны, желательно дать подсказки, чтобы вопрошающий додумался до решения сам (что к сожалению, не произошло).

mrspd 26.09.2010 11:20

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

Кто вам мешает брать начальные значения с сервера?

Мой пример показывает как это можно вписать в 20 строк, при этом заметьте, там нет не одного условия. А с вашими ifswitchelse'овыми конструкциями, чёрт ногу сломит...

Помимо этого код более читабелен, даже без комментариев. Даже если вы свои if конструкции откомментируете, у вас в совокупности комментариев получится больше, чем у меня кода ;)

with-love-from-siberia 26.09.2010 11:32

mrspd, Я с Вами полностью согласен, что работу таймера лучше реализовать с переменными типа Date. Но так уж сложилось, что у автора данной темы данные уже сформированы и необходимо работать с ними. Хотя, он мог бы изменить (полагаю, что мог бы) свой алгоритм на сервере, чтобы временнАя переменная формировалась на сервере, а клиентская часть уже работала в ней.

Посмотрите внимательно, я давал две подсказки, одна из них предлагает работать с целочисленным представлением времени. Именно это я имею в виду, говоря, что Ваш алгоритм - есть модификация моего словесного описания. Но есть отличия: Вы предлагаете вычислять разницу между началом и концом, я предлагаю вычитать единицу из уже существующей разницы. Однако, автору желается работать раздельно с каждой составляющей времени.

Можно, с определенной натяжкой, это рассматривать как третий вариант. К сожалению, автор темы не смог близко подойти ни к одному из предложенных решений.

t0xas 26.09.2010 18:22

Братья мир, я понял свои ошибки, драться не надо.
да принижать достоинство других не стоит, чтобы возвысить свое.
Всем спасибо. Я учусь и рад вашим подсказкам.


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