02.04.2013, 10:40
|
Новичок на форуме
|
|
Регистрация: 02.04.2013
Сообщений: 7
|
|
Помогите новичку с NaN
Очень расчитываю на вас о умы JS!
Сделал банер в виде часов! Выводит в формате "дней:часов:минут:секунд" - сколько осталось до события!
В FireFox 18/0/1 версии отображает всё хорошо, а вот в др. браузерах пишет: "NaN:NaN:NaN:NaN"
Подскажите пожалуйста!!!
П.С. (Строка вывода: dday+":"+dhour+":"+dmin+":"+dsec) она же преобразует переменные в строковый тип, а в итоге NaN. Непонятно...
Код js:
function countdown(yr,m,d,ho,mi,se){
theyear=yr;themonth=m;theday=d;theh=ho;them=mi;thes=se;
var today=new Date()
var todayy=today.getYear()
if (todayy < 1000) todayy+=1900
var todaym=today.getMonth()
var todayd=today.getDate()
var todayh=today.getHours()
var todaymin=today.getMinutes()
var todaysec=today.getSeconds()
var todaystring=montharray[todaym]+" "+todayd+", "+todayy+" "+todayh+":"+todaymin+":"+todaysec
futurestring=montharray[m-1]+" "+d+", "+yr+" "+ho+":"+mi+":"+se;
dd=Date.parse(futurestring)-Date.parse(todaystring)
dday=Math.floor(dd/(60*60*1000*24)*1)
dhour=Math.floor((dd%(60*60*1000*24))/(60*60*1000)*1)
dmin=Math.floor(((dd%(60*60*1000*24))%(60*60*1000))/(60*1000)*1)
dsec=Math.floor((((dd%(60*60*1000*24))%(60*60*1000))%(60*1000))/1000*1)
if(dday==0&&dhour==0&&dmin==0&&dsec==1){
$('#time').text('Консультация началась!');
return
} else {
if(dday < 10) dday = "0"+dday;
if(dhour < 10) dhour = "0"+dhour;
if(dmin < 10) dmin = "0"+dmin;
if(dsec < 10) dsec = "0"+dsec;
$('#time').text(dday+":"+dhour+":"+dmin+":"+dsec);
}
setTimeout("countdown(theyear,themonth,theday,theh,them,thes)",1000);
}
|
|
02.04.2013, 11:12
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
а самому отслеживать значения своих переменных через alert или console.log, не?
|
|
02.04.2013, 11:24
|
Новичок на форуме
|
|
Регистрация: 02.04.2013
Сообщений: 7
|
|
Сообщение от dmitriymar
|
а самому отслеживать значения своих переменных через alert или console.log, не?
|
Через alert пробовал! И толку в FireFox выдаёт мои цифры. К примеру: "01:12:32:55" а все остальные браузеры NaN:NaN:NaN:NaN
|
|
02.04.2013, 11:51
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,590
|
|
NaN получается когда проводишь арифметическую операцию с тем, что гарантировано не является числом. Соответственно проверяй переменные до того как начнёшь с ними работать.
Скорее всего проблема в Date.parse(), т.к. разные браузеры по разному понимают(или не пониают) входные строки.
__________________
29375, 35
Последний раз редактировалось Aetae, 02.04.2013 в 11:55.
|
|
02.04.2013, 12:26
|
|
Профессор
|
|
Регистрация: 28.02.2011
Сообщений: 349
|
|
Нифиганепонимаю.
В первой строчке функции выставляются переменные (видимо глобальные)
theyear,themonth,theday,theh,them,thes
В последней строчке выставляется таймаут, который, когда сработает, передаст эти переменные в функцию, которая опять из выставит в себя же. Больше нигде они не используются и не меняются.
Сорри, это не ответ на вопрос, просто недоумение, зачем их гонять по кругу?
|
|
02.04.2013, 13:13
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от rgl
|
Нифиганепонимаю.
|
Я думаю автор - тоже ))
|
|
02.04.2013, 13:33
|
Новичок на форуме
|
|
Регистрация: 02.04.2013
Сообщений: 7
|
|
Сообщение от Aetae
|
NaN получается когда проводишь арифметическую операцию с тем, что гарантировано не является числом. Соответственно проверяй переменные до того как начнёшь с ними работать.
Скорее всего проблема в Date.parse(), т.к. разные браузеры по разному понимают(или не пониают) входные строки.
|
Спасибо Aetae! Ваш ответ помог мне найти ошибку!
Короче так:
Вывожу alert(futurestring); Получаю: "Aug 04, 2013 24:00:00"
Date.parse(futurestring) для FF выводит: 1365109200000, а вот для IE выводит NaN. Очевидно что EE 24 часа воспринимает, а для IE нужно 00 часов. Заменил 24 на 00! Все!
п.с. поспешил спрашивать... просто ещё мало практики ) спс!
|
|
02.04.2013, 13:50
|
Новичок на форуме
|
|
Регистрация: 02.04.2013
Сообщений: 7
|
|
Для danik.js и rgl
Сообщение от rgl
|
Нифиганепонимаю.
В первой строчке функции выставляются переменные (видимо глобальные)
theyear,themonth,theday,theh,them,thes
В последней строчке выставляется таймаут, который, когда сработает, передаст эти переменные в функцию, которая опять из выставит в себя же. Больше нигде они не используются и не меняются.
Сорри, это не ответ на вопрос, просто недоумение, зачем их гонять по кругу?
|
Для того чтобы они всегда были в памяти!
Задал дату события ("апокалипсиса"):
<body><script>
countdown('2013','04','04','00','00','00');
</script></body>
Поехали в js:
function countdown(yr,m,d,ho,mi,se) {
/* ПРИСВОИЛИ! */
theyear=yr;themonth=m;theday=d;theh=ho;them=mi;thes=se;
/*................*/
var todaystring=montharray[todaym]+" "+todayd+", "+todayy+" "+todayh+":"+todaymin+":"+todaysec
futurestring=montharray[m-1]+" "+d+", "+yr+" "+ho+":"+mi+":"+se
/*Сократили время до "АПОКАЛИПСИСА" на 1 сек.*/
/*Вот тут: futurestring - фиксировано хранит ('Aug 04, 2013 00:00:00')*/
dd=Date.parse(futurestring)-Date.parse(todaystring)
/*.................*/
/*вывести сколько осталось времени*/
$('#time').text(dday+":"+dhour+":"+dmin+":"+dsec);
/*и снова пошли в процедуру*/
setTimeout("countdown(theyear,themonth,theday,theh,them,thes)",1000);
}
А гоняю я их для того чтоб каждый раз процедура имела входные параметры - т.е. дату начала "апокалипсиса". Как вы в 2-ем не поняли... хммм
Тема закрыта!
Последний раз редактировалось tassman, 02.04.2013 в 13:56.
|
|
02.04.2013, 14:25
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от tassman
|
Для того чтобы они всегда были в памяти!
|
Хм, точно, это все объясняет )))
Сообщение от tassman
|
Как вы в 2-ем не поняли... хммм
|
Простите великодушно. Спасибо что наставили нас на путь истинный.
Благодарим, о великий профессор за столь точное и краткое объяснение.
Вот только ваша теория о постоянстве переменных несостоятельна:
<script>
function countdown(yr,m,d,ho,mi,se){
//theyear=yr;themonth=m;theday=d;theh=ho;them=mi;thes=se;
var today=new Date()
var todayy=today.getYear()
if (todayy < 1000) todayy+=1900
var todaym=today.getMonth()
var todayd=today.getDate()
var todayh=today.getHours()
var todaymin=today.getMinutes()
var todaysec=today.getSeconds()
var todaystring=montharray[todaym]+" "+todayd+", "+todayy+" "+todayh+":"+todaymin+":"+todaysec
futurestring=montharray[m-1]+" "+d+", "+yr+" "+ho+":"+mi+":"+se;
dd=Date.parse(futurestring)-Date.parse(todaystring)
dday=Math.floor(dd/(60*60*1000*24)*1)
dhour=Math.floor((dd%(60*60*1000*24))/(60*60*1000)*1)
dmin=Math.floor(((dd%(60*60*1000*24))%(60*60*1000))/(60*1000)*1)
dsec=Math.floor((((dd%(60*60*1000*24))%(60*60*1000))%(60*1000))/1000*1)
if(dday==0&&dhour==0&&dmin==0&&dsec==1){
$('#time').text('Консультация началась!');
return
} else {
if(dday < 10) dday = "0"+dday;
if(dhour < 10) dhour = "0"+dhour;
if(dmin < 10) dmin = "0"+dmin;
if(dsec < 10) dsec = "0"+dsec;
$('#time').text(dday+":"+dhour+":"+dmin+":"+dsec);
}
setTimeout(function(){
countdown(yr,m,d,ho,mi,se)
},1000);
}
</script>
<div id="time"></div>
<script src="//code.jquery.com/jquery-latest.js"></script>
<script>
montharray = [];
montharray[3] = 'Apr';
countdown('2013','04','04','00','00','00');
</script>
Кстати, профессор, не просветите нас, зачем формируется строка todaystring ? Чтобы ее тутже распарсить? Ооо, это какой-то хитрый план ?
|
|
02.04.2013, 14:29
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Кто не знаком, представляю вам индусского профессора tassman'а, мастера по написанию индусского кода, чемпиона мира по увеличению объема кода без видимой потери производительности. Учитесь сосунки!
|
|
|
|