Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.04.2013, 10:40
Новичок на форуме
Отправить личное сообщение для tassman Посмотреть профиль Найти все сообщения от tassman
 
Регистрация: 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);
}
Ответить с цитированием
  #2 (permalink)  
Старый 02.04.2013, 11:12
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

а самому отслеживать значения своих переменных через alert или console.log, не?
Ответить с цитированием
  #3 (permalink)  
Старый 02.04.2013, 11:24
Новичок на форуме
Отправить личное сообщение для tassman Посмотреть профиль Найти все сообщения от tassman
 
Регистрация: 02.04.2013
Сообщений: 7

Сообщение от dmitriymar Посмотреть сообщение
а самому отслеживать значения своих переменных через alert или console.log, не?
Через alert пробовал! И толку в FireFox выдаёт мои цифры. К примеру: "01:12:32:55" а все остальные браузеры NaN:NaN:NaN:NaN
Ответить с цитированием
  #4 (permalink)  
Старый 02.04.2013, 11:51
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,577

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

Последний раз редактировалось Aetae, 02.04.2013 в 11:55.
Ответить с цитированием
  #5 (permalink)  
Старый 02.04.2013, 12:26
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Нифиганепонимаю.
В первой строчке функции выставляются переменные (видимо глобальные)
theyear,themonth,theday,theh,them,thes
В последней строчке выставляется таймаут, который, когда сработает, передаст эти переменные в функцию, которая опять из выставит в себя же. Больше нигде они не используются и не меняются.
Сорри, это не ответ на вопрос, просто недоумение, зачем их гонять по кругу?
Ответить с цитированием
  #6 (permalink)  
Старый 02.04.2013, 13:13
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от rgl
Нифиганепонимаю.
Я думаю автор - тоже ))
Ответить с цитированием
  #7 (permalink)  
Старый 02.04.2013, 13:33
Новичок на форуме
Отправить личное сообщение для tassman Посмотреть профиль Найти все сообщения от tassman
 
Регистрация: 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! Все!

п.с. поспешил спрашивать... просто ещё мало практики ) спс!
Ответить с цитированием
  #8 (permalink)  
Старый 02.04.2013, 13:50
Новичок на форуме
Отправить личное сообщение для tassman Посмотреть профиль Найти все сообщения от tassman
 
Регистрация: 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.
Ответить с цитированием
  #9 (permalink)  
Старый 02.04.2013, 14:25
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 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 ? Чтобы ее тутже распарсить? Ооо, это какой-то хитрый план ?
Ответить с цитированием
  #10 (permalink)  
Старый 02.04.2013, 14:29
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите плис новичку в ajax urel AJAX и COMET 6 12.01.2013 21:36
Помогите новичку плиз!!!!!!!!!!!!! Юрий Манылов Общие вопросы Javascript 1 18.12.2012 11:37
Помогите новичку! Анатолий Саратовцев Events/DOM/Window 7 04.08.2012 17:46
Выезжающая картинка. помогите плз новичку(( animus Элементы интерфейса 4 22.04.2011 14:31
Помогите новичку с выпадающим списком interest Элементы интерфейса 5 19.05.2010 13:15