Написал часики для обратного отсчета. Подскажите где слажал
$(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, а догнать по логике не могу. Мне кажется ваще код превратился в фарш:( и много лишнего. но я путаться начал жутко. Посоветуйте как оптимизироватью |
Цитата:
|
Цитата:
Формулируйте алгоритм словесно, графически, добейтесь ясности и лаконичности, а потом реализуйте в коде. оффтопом. Интересно, а блок-схемы сейчас кто-нибудь помнит? Пишут алгоритмы на бумажке или сразу -- в лапшу? |
Цитата:
Посему изначально приходится действовать по принципу Keep It Stupid...
if(day == 0) {
day = 0;
Если day равно 0, то day равно 0... |
Цитата:
Эту задачу можно решить двумя способами. Подсказка 1: Видимо автор желает, чтобы таймер работал так (часы-минуты-секунды): 01:01:01 01:01:00 01:00:59 ... 01:00:02 01:00:01 01:00:00 00:59:59 Посмотрите на пример и найдите закономерность. Подсказка 2: Сколько секунд в днях-часах-минутах? Как можно отнять одну секунду из дней-часов-минут-секунд? |
Продумать алгоритм?
Пройдитесь пожалуйста в соседнюю темку "Вывод значения onclick", разве там проблема в алгоритме? |
Спасибо за советы
Оцените новый вариант. Ничего умнее не придумал как вставить стоп сигналы в иф.
<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>
|
После тега "[ js]" пиши run = "[ js run]" так удобнее смотреть, имхо.
Но тогда нужно и html теги к которым ты обращаешься, писать... Я конечно не гуру, но зачем каждую миллисекунду обновлять? setTimeout(getTimer, 1); |
а это для теста ) извиняюсь, забыл сменить.
|
Ойтыжхоспади... Сложить все, вычесть единицу и снова расложить по отдельным элементам не можете...
А в начальной школе вычитанию столбиком учились? Или пропустили? Иэээх... Думать совсем разучились. Догадаетесь куда и вместо чего это вставить?
...
// все - отчет закончен, выходим и больше ничего не делаем
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;
}
|
Вас всех тут на говнокод можно отправить смело. Если таймер, так и работать надо со временем!
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);
|
mrspd, не умничайте. Ваш пример, по сути, - модификация алгоритма, словесно описанного вот этой строкой
Цитата:
|
Создать конструкцию из множества условий по праву просто нельзя назвать правильным кодом.
Кто вам мешает брать начальные значения с сервера? Мой пример показывает как это можно вписать в 20 строк, при этом заметьте, там нет не одного условия. А с вашими ifswitchelse'овыми конструкциями, чёрт ногу сломит... Помимо этого код более читабелен, даже без комментариев. Даже если вы свои if конструкции откомментируете, у вас в совокупности комментариев получится больше, чем у меня кода ;) |
mrspd, Я с Вами полностью согласен, что работу таймера лучше реализовать с переменными типа Date. Но так уж сложилось, что у автора данной темы данные уже сформированы и необходимо работать с ними. Хотя, он мог бы изменить (полагаю, что мог бы) свой алгоритм на сервере, чтобы временнАя переменная формировалась на сервере, а клиентская часть уже работала в ней.
Посмотрите внимательно, я давал две подсказки, одна из них предлагает работать с целочисленным представлением времени. Именно это я имею в виду, говоря, что Ваш алгоритм - есть модификация моего словесного описания. Но есть отличия: Вы предлагаете вычислять разницу между началом и концом, я предлагаю вычитать единицу из уже существующей разницы. Однако, автору желается работать раздельно с каждой составляющей времени. Можно, с определенной натяжкой, это рассматривать как третий вариант. К сожалению, автор темы не смог близко подойти ни к одному из предложенных решений. |
Братья мир, я понял свои ошибки, драться не надо.
да принижать достоинство других не стоит, чтобы возвысить свое. Всем спасибо. Я учусь и рад вашим подсказкам. |
| Часовой пояс GMT +3, время: 05:41. |