Виснет браузер из-за скрипта таймера!
Друзья такая проблема. Есть скрипт таймера
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> |
если "ms>1", чтобы это ни значило, то setTimeout запускается 2 раза
видимо через некоторое время очередь из таймеров становится слишком большой решение -- переработать логику и запускать setTimeout 1 или 0 раз также вместо setTimeout("setTimer()",1000) лучше писать setTimeout(setTimer,1000) это по разным причинам правильнее |
59 строку убрать, или поставить else.
Кстати, код много где можно укоротить, например вместо этого: Цитата:
var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; month = months[month]; |
всем спасибо за участие, нашел таки ошибку
59 строка лишняя setTimeout("setTimer()",1000); |
отдельное спасибо Руслану, часто выручаешь и всегда дельные советы...
|
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); } } На скорую руку :victory: |
какая то ошибка в 19 строке
|
iskander83, поправил, там между = и > был лишний пробел :)
|
Цитата:
|
Часовой пояс GMT +3, время: 12:17. |