Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Помогите новичку с NaN (https://javascript.ru/forum/dom-window/36955-pomogite-novichku-s-nan.html)

tassman 02.04.2013 10:40

Помогите новичку с 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);
}

dmitriymar 02.04.2013 11:12

а самому отслеживать значения своих переменных через alert или console.log, не?

tassman 02.04.2013 11:24

Цитата:

Сообщение от dmitriymar (Сообщение 243880)
а самому отслеживать значения своих переменных через alert или console.log, не?

Через alert пробовал! И толку в FireFox выдаёт мои цифры. К примеру: "01:12:32:55" а все остальные браузеры NaN:NaN:NaN:NaN

Aetae 02.04.2013 11:51

NaN получается когда проводишь арифметическую операцию с тем, что гарантировано не является числом. Соответственно проверяй переменные до того как начнёшь с ними работать.
Скорее всего проблема в Date.parse(), т.к. разные браузеры по разному понимают(или не пониают) входные строки.

rgl 02.04.2013 12:26

Нифиганепонимаю.
В первой строчке функции выставляются переменные (видимо глобальные)
theyear,themonth,theday,theh,them,thes
В последней строчке выставляется таймаут, который, когда сработает, передаст эти переменные в функцию, которая опять из выставит в себя же. Больше нигде они не используются и не меняются.
Сорри, это не ответ на вопрос, просто недоумение, зачем их гонять по кругу?

danik.js 02.04.2013 13:13

Цитата:

Сообщение от rgl
Нифиганепонимаю.

Я думаю автор - тоже ))

tassman 02.04.2013 13:33

Цитата:

Сообщение от Aetae (Сообщение 243884)
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! Все! :thanks:

п.с. поспешил спрашивать... просто ещё мало практики ) спс!

tassman 02.04.2013 13:50

Для danik.js и rgl
Цитата:

Сообщение от rgl (Сообщение 243888)
Нифиганепонимаю.
В первой строчке функции выставляются переменные (видимо глобальные)
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-ем не поняли... хммм :nono:

Тема закрыта!

danik.js 02.04.2013 14:25

Цитата:

Сообщение от 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 ? Чтобы ее тутже распарсить? Ооо, это какой-то хитрый план ?

danik.js 02.04.2013 14:29

Кто не знаком, представляю вам индусского профессора tassman'а, мастера по написанию индусского кода, чемпиона мира по увеличению объема кода без видимой потери производительности. Учитесь сосунки!


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