定時器開之前一定要清,這是我之前疏忽的,導致頁面倒計時占用記憶體,頁面崩潰。
1 // 商品倒計時用一個定時器來寫 2 //type 是不同頁面 3 var timecountdown = { 4 Secondms_jx: 60 * 1000, 5 minutems_jx: 1000, 6 h: 100, 7 timehms: false 8 }; 9 10 timecountdown.updateEndTime = function(type) { 11 var _that = this; 12 $(".item-djx").each(function(i, el) { 13 if(!this.num){ 14 var endTime = parseInt(this.getAttribute("endTime")); 15 }else{ 16 var endTime=this.num; 17 } 18 var key = parseInt(this.getAttribute("itemid")); 19 20 21 if (endTime < 0) { 22 return true; //跳過此次迴圈 23 } else { 24 endTime = endTime - 1000; 25 } 26 this.num=endTime; 27 _that.clock_jx(key, endTime, type); 28 }); 29 30 setTimeout(function() { 31 _that.updateEndTime(type); 32 if(!_that.timehms){ 33 _that.hmstime(); 34 } 35 }, 1000); 36 } 37 38 timecountdown.clock_jx = function(key, diff, skin) { 39 var _that = this; 40 41 if (diff <= 0) { 42 $("#leftTimeJx" + key).parent().hide(); 43 $("#leftTimeJx" + key).parent().parent().find('.jx-ing').show(); 44 $.post('/yunbuy/lottery', 'skin=' + skin + '&id=' + key, function(data) { 45 setTimeout(function() { 46 $('#itemDjx' + key).remove(); 47 $('#win-list .item-db').eq(0).before(data.html); 48 }, 5000); 49 }, 'json'); 50 } else { 51 var DifferSecond = Math.floor(diff / _that.Secondms_jx); 52 diff -= DifferSecond * _that.Secondms_jx; 53 var DifferMinute = Math.floor(diff / _that.minutems_jx); 54 diff -= DifferMinute * _that.minutems_jx; 55 56 if (DifferSecond.toString().length < 2) DifferSecond = '0' + DifferSecond; 57 if (DifferMinute.toString().length < 2) DifferMinute = '0' + DifferMinute; 58 59 var sTime = ""; 60 sTime += "<span>" + DifferSecond + "</span><b>:</b>"; 61 sTime += "<span>" + DifferMinute + "</span><b>:</b>"; 62 sTime += "<span class='timeHm'>" + 99 + "</span>"; 63 document.getElementById("leftTimeJx" + key).innerHTML = sTime; //顯示倒計時信息 64 } 65 } 66 timecountdown.hmstime = function() { 67 //毫秒單獨計時 68 var _that = this; 69 70 clearInterval(_that.timehms); 71 _that.timehms = setInterval(function() { 72 73 if (_that.h <= 0) _that.h = 100; 74 _that.h = parseInt(_that.h) - 1; 75 if (_that.h.toString().length < 1) _that.h = '00'; 76 if (_that.h.toString().length == 1) _that.h = '0' + _that.h; 77 if (_that.h.toString().length > 2) _that.h = '99'; 78 setTimeout(function() { 79 if ($('.timeHm').length == 0) { 80 clearInterval(_that.timehms); 81 _that.timehms=false; //此處一定要賦值,不然下次 再次開啟 我用的這個值得判斷 就會不准,雖然定時器清了,但是那個值一直存在,可以說是定時器id 82 }; 83 }, 5000); 84 85 $('.timeHm').html(_that.h) 86 }, 15); 87 } 88 89 timecountdown.hmstime();清空定時器之後 輸出timehms 這個值一直存在 而且占用記憶體 for(var i=0;i<10;i++){ var a=setInterval("1",10); console.log(a); } 這個定時器其實開了10個,但是只有最後一個有名字,能控制,其他都控制不了,而且清不掉,占用記憶體。 會看到 開多少個定時器,他的id 會越來愈大。占用記憶體,小心記憶體泄露。因此 商城 多個計算 最好用迴圈,一次定時器搞定 ,一個方法里最好只開一個定時器,再開之前先清定時器。方式定時器過多,控制不過來 瀏覽器機制 定時器的假死狀態 定時器有一個問題,就是當頁面中開一個定時器,然後你沒有關閉頁面,繼續瀏覽其他網頁,過一會(幾分鐘)你在瀏覽這個定時器,這個定時器,在這期間是假死狀態,就是不執行,你在返回來看到的估計就是定時器只進行了幾秒。 解決方案:暫無,以後有了再添加