Помогите новичку с NaN
Очень расчитываю на вас о умы JS! :victory:
Сделал банер в виде часов! Выводит в формате "дней:часов:минут:секунд" - сколько осталось до события! В FireFox 18/0/1 версии отображает всё хорошо, а вот в др. браузерах пишет: "NaN:NaN:NaN:NaN" Подскажите пожалуйста!!! П.С. (Строка вывода: dday+":"+dhour+":"+dmin+":"+dsec) она же преобразует переменные в строковый тип, а в итоге NaN. Непонятно... :help: Код 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);
}
|
а самому отслеживать значения своих переменных через alert или console.log, не?
|
Цитата:
|
NaN получается когда проводишь арифметическую операцию с тем, что гарантировано не является числом. Соответственно проверяй переменные до того как начнёшь с ними работать.
Скорее всего проблема в Date.parse(), т.к. разные браузеры по разному понимают(или не пониают) входные строки. |
Нифиганепонимаю.
В первой строчке функции выставляются переменные (видимо глобальные) theyear,themonth,theday,theh,them,thes В последней строчке выставляется таймаут, который, когда сработает, передаст эти переменные в функцию, которая опять из выставит в себя же. Больше нигде они не используются и не меняются. Сорри, это не ответ на вопрос, просто недоумение, зачем их гонять по кругу? |
Цитата:
|
Цитата:
Короче так: Вывожу alert(futurestring); Получаю: "Aug 04, 2013 24:00:00" Date.parse(futurestring) для FF выводит: 1365109200000, а вот для IE выводит NaN. Очевидно что EE 24 часа воспринимает, а для IE нужно 00 часов. Заменил 24 на 00! Все! :thanks: п.с. поспешил спрашивать... просто ещё мало практики ) спс! |
Для danik.js и rgl
Цитата:
Задал дату события ("апокалипсиса"): <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-ем не поняли... хммм :nono: Тема закрыта! |
Цитата:
Цитата:
Благодарим, о великий профессор за столь точное и краткое объяснение. Вот только ваша теория о постоянстве переменных несостоятельна:
<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 ? Чтобы ее тутже распарсить? Ооо, это какой-то хитрый план ? |
Кто не знаком, представляю вам индусского профессора tassman'а, мастера по написанию индусского кода, чемпиона мира по увеличению объема кода без видимой потери производительности. Учитесь сосунки!
|
| Часовой пояс GMT +3, время: 20:42. |