Помогите новичку с 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, время: 06:00. |