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 не?
|
|
|
|