首页 > 其他 > 详细

定时器遇到的坑

时间:2016-03-04 20:47:37      阅读:164      评论:0      收藏:0      [点我收藏+]
 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 会越来愈大。占用内存,小心内存泄露。因此 商城 多个计算 最好用循环,一次定时器搞定
,一个方法里最好只开一个定时器,再开之前先清定时器。方式定时器过多,控制不过来
 
 
 
 
浏览器机制  定时器的假死状态
定时器有一个问题,就是当页面中开一个定时器,然后你没有关闭页面,继续浏览其他网页,过一会(几分钟)你在浏览这个定时器,这个定时器,在这期间是假死状态,就是不执行,你在返回来看到的估计就是定时器只进行了几秒。
解决方案:暂无,以后有了再添加

定时器遇到的坑

原文:http://www.cnblogs.com/yangjingjing/p/5243163.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!