Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.06.2013, 17:57
Аспирант
Отправить личное сообщение для iskander83 Посмотреть профиль Найти все сообщения от iskander83
 
Регистрация: 04.05.2013
Сообщений: 73

Виснет браузер из-за скрипта таймера!
Друзья такая проблема. Есть скрипт таймера
document.getElementsByTagName("body")[0].onload=setTimer;

function setTimer()
{
	var maxDays = 3;
	var time = "00:00:00"; 
	
    var now = new Date();	
	var date=now.getDate();
	var year=now.getFullYear();
	var month=now.getMonth()+1;
	if (month==12) month=0;
	switch(month) {
		case 0:month="January";break
		case 1:month="February";break
		case 2:month="March";break
		case 3:month="April";break
		case 4:month="May";break
		case 5:month="June";break
		case 6:month="July";break
		case 7:month="August";break
		case 8:month="September";break
		case 9:month="October";break
		case 10:month="November";break
		case 11:month="December";break
	}
	var daysReal=date%maxDays;
	var FullDate=year+","+month+",1";
    var endOfTimer = new Date(FullDate);//05:00:00"); "Jun,12,2013,"+
    var ms = (endOfTimer.getTime()-now.getTime());
	daysReal= Math.floor(ms/(1000*60*60*24));
    if (ms>1)
    {
        var sec=(parseInt(ms/1000));
        var days=(parseInt(sec/(24*60*60)));
        var secInLastDay=sec-days*24*3600;
        var hours=(parseInt(secInLastDay/3600));
        var secInLastHour=secInLastDay-hours*3600;
        var minutes=(parseInt(secInLastHour/60));
        var lastSec=secInLastHour-minutes*60;
		document.getElementById('d').innerHTML = daysReal;
		document.getElementById('h').innerHTML = ((hours<10)?(hours="0"+hours): hours);
		document.getElementById('m').innerHTML = ((minutes<10)?(minutes="0"+minutes): minutes);
		document.getElementById('s').innerHTML = ((lastSec<10)?(lastSec="0"+lastSec): lastSec);
		var daysStr = "дня";
		if(days==0 || days >= 5) daysStr = "дней"; else if(days==1)daysStr="день";
		var hourStr = "часов";
		if((hours>=2 && hours<=4) || hours>=22) hourStr="часа"; else if(hours==1 || hours==21) hourStr='час';
		var minStr="минут";
		if(minutes%10==1 && Math.floor(minutes/10)!=1) minStr="минута"; else if ((minutes%10>=2 && minutes%10<=4) && Math.floor(minutes/10)!=1) minStr="минуты";
		var secStr ="секунд";
		if(lastSec%10==1 && Math.floor(lastSec/10)!=1) secStr="секунда"; else if ((lastSec%10>=2 && lastSec%10<=4) && Math.floor(lastSec/10)!=1) secStr="секунды";
		document.getElementById('ds').innerHTML = daysStr;
		document.getElementById('hs').innerHTML = hourStr;
		document.getElementById('ms').innerHTML = minStr;
		document.getElementById('ss').innerHTML = secStr;
        setTimeout("setTimer()",1000);
    }
	setTimeout("setTimer()",1000);
}



подключаю на страницу все работает, но так грузит браузер через минуту что он виснет... посмотрел в процессах (800мб оперативки занимает и растет...)

Кто может помочь? Заранее спасибо!

Вот html
<div id="timer">
            <table width="237" height="73px" border="0" class="center_me">
              <tr>
                <td id="d"  class="blueDigit">2</td>
                <td id="h"   class="blueDigit">23</td>
                <td id="m"   class="blueDigit">54</td>
                <td id="s"  class="redDigit">55</td>
              </tr>
              <tr class="timeWords">
                <td id="ds">дня</td>
                <td id="hs">часов</td>
                <td id="ms">минут</td>
                <td id="ss">секунд</td>
              </tr>
            </table>
            <p class="center_me"></p>
</div>

Последний раз редактировалось iskander83, 28.06.2013 в 17:59.
Ответить с цитированием
  #2 (permalink)  
Старый 28.06.2013, 18:28
Профессор
Отправить личное сообщение для mta88 Посмотреть профиль Найти все сообщения от mta88
 
Регистрация: 16.05.2013
Сообщений: 229

если "ms>1", чтобы это ни значило, то setTimeout запускается 2 раза
видимо через некоторое время очередь из таймеров становится слишком большой
решение -- переработать логику и запускать setTimeout 1 или 0 раз

также вместо setTimeout("setTimer()",1000) лучше писать setTimeout(setTimer,1000)
это по разным причинам правильнее
Ответить с цитированием
  #3 (permalink)  
Старый 28.06.2013, 18:40
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

59 строку убрать, или поставить else.

Кстати, код много где можно укоротить, например вместо этого:
Цитата:
switch(month) {
case 0:month="January";break
case 1:month="February";break
case 2:month="March";break
case 3:month="April";break
case 4:month="May";break
case 5:month="June";break
case 6:month="July";break
case 7:month="August";break
case 8:month="September";break
case 9:month="October";break
case 10:month="November";break
case 11:month="December";break
Можно написать так:
var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
month = months[month];

Последний раз редактировалось ruslan_mart, 28.06.2013 в 19:02.
Ответить с цитированием
  #4 (permalink)  
Старый 28.06.2013, 18:42
Аспирант
Отправить личное сообщение для iskander83 Посмотреть профиль Найти все сообщения от iskander83
 
Регистрация: 04.05.2013
Сообщений: 73

всем спасибо за участие, нашел таки ошибку
59 строка лишняя setTimeout("setTimer()",1000);
Ответить с цитированием
  #5 (permalink)  
Старый 28.06.2013, 18:44
Аспирант
Отправить личное сообщение для iskander83 Посмотреть профиль Найти все сообщения от iskander83
 
Регистрация: 04.05.2013
Сообщений: 73

отдельное спасибо Руслану, часто выручаешь и всегда дельные советы...
Ответить с цитированием
  #6 (permalink)  
Старый 28.06.2013, 18:59
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

var $id = function(a, b) {
   document.getElementById(a).innerHTML = b;
}, months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];

document.body.onload = setTimer;
 
function setTimer()
{
    var maxDays = 3, time = '00:00:00', now = new Date(), date = now.getDate(), year = now.getFullYear(), month = now.getMonth()+1;
    if (month == 12) month = 0;
    month = months[month];
    var daysReal = date%maxDays, FullDate = year+','+month+',1';
    var endOfTimer = new Date(FullDate), ms = (endOfTimer.getTime()-now.getTime());
    daysReal = Math.floor(ms/(1000*60*60*24));
    if (ms>1)
    {
        var sec =  (parseInt(ms/1000)), days = (parseInt(sec/(24*60*60))), secInLastDay = sec-days*24*3600;
        var hours = (parseInt(secInLastDay/3600)), secInLastHour = secInLastDay-hours*3600, minutes = (parseInt(secInLastHour/60)), lastSec=secInLastHour-minutes*60;
        var daysStr = (days == 0 || days >= 5) ? 'дней' : (days == 1 ? 'день' : 'дня');
        var hourStr = ((hours>=2 && hours<=4) || hours>=22) ? 'часа' ? ((hours==1 || hours==21) ? 'час' : 'часов');
        var minStr = minutes%10==1 && Math.floor(minutes/10)!=1) ? 'минута' ? (((minutes%10>=2 && minutes%10<=4) && Math.floor(minutes/10)!=1) ? 'минуты' : 'минуты')l
        var secStr = (lastSec%10==1 && Math.floor(lastSec/10)!=1) ? 'секунда' : (((lastSec%10>=2 && lastSec%10<=4) && Math.floor(lastSec/10)!=1) ? 'секунды' : 'секунд');
        var html = {d: daysReal, h: ((hours<10) ? (hours='0'+hours) : hours), m: ((minutes<10) ?(minutes='0'+minutes) : minutes), s: ((lastSec<10)?(lastSec="0"+lastSec): lastSec), ds: daysStr, hs: hourStr, ms: minStr, ss: srcStr}
        for(var i in html) $id(i, html[i]);
        setTimeout(setTimer, 1000);
    }
}


На скорую руку

Последний раз редактировалось ruslan_mart, 29.06.2013 в 04:46.
Ответить с цитированием
  #7 (permalink)  
Старый 28.06.2013, 19:32
Аспирант
Отправить личное сообщение для iskander83 Посмотреть профиль Найти все сообщения от iskander83
 
Регистрация: 04.05.2013
Сообщений: 73

какая то ошибка в 19 строке
Ответить с цитированием
  #8 (permalink)  
Старый 29.06.2013, 04:47
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

iskander83, поправил, там между = и > был лишний пробел
Ответить с цитированием
  #9 (permalink)  
Старый 29.06.2013, 08:29
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от Ruslan_xDD
setTimeout(setTimer, 1000);
setInterval не?
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подвисание работы скрипта mel63 jQuery 0 09.09.2011 16:41
Чем можно организовать запуск скрипта атом. по времени. I5Rek Серверные языки и технологии 2 01.05.2011 23:00
запретить повторный запуск таймера setInterval-clearInterval mrWong Общие вопросы Javascript 1 01.02.2010 12:25
Круговорт скрипта.... Karl Общие вопросы Javascript 1 17.10.2009 15:37
Блок переключения меню на JS, два скрипта в одном файле Dizeloid Элементы интерфейса 0 30.07.2009 12:03