 
			
				28.06.2013, 17:57
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 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.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				28.06.2013, 18:28
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 16.05.2013 
					
					
					
						Сообщений: 229
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 если "ms>1", чтобы это ни значило, то setTimeout запускается 2 раза 
видимо через некоторое время очередь из таймеров становится слишком большой 
решение -- переработать логику и запускать setTimeout 1 или 0 раз 
 
также вместо setTimeout("setTimer()",1000) лучше писать setTimeout(setTimer,1000) 
это по разным причинам правильнее 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				28.06.2013, 18:40
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 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.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				28.06.2013, 18:42
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 04.05.2013 
					
					
					
						Сообщений: 73
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 всем спасибо за участие, нашел таки ошибку 
59 строка лишняя  setTimeout("setTimer()",1000); 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				28.06.2013, 18:44
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 04.05.2013 
					
					
					
						Сообщений: 73
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 отдельное спасибо Руслану, часто выручаешь и всегда дельные советы... 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				28.06.2013, 18:59
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 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.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				28.06.2013, 19:32
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 04.05.2013 
					
					
					
						Сообщений: 73
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 какая то ошибка в 19 строке 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				29.06.2013, 04:47
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 30.04.2012 
					
					
					
						Сообщений: 3,018
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		iskander83, поправил, там между = и > был лишний пробел    
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				29.06.2013, 08:29
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 что-то знаю 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 24.05.2009 
					
					
					
						Сообщений: 5,176
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Ruslan_xDD
			
		
	 | 
 
	| 
		setTimeout(setTimer, 1000);
	 | 
 
	
 
 setInterval не?  
		
	
		
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 
 
 
 
	 | 
 
 
 |