码迷,mamicode.com
首页 > Web开发 > 详细

setInterval、ajax 并用引发的内存漏泄

时间:2015-03-30 22:42:53      阅读:365      评论:0      收藏:0      [点我收藏+]

标签:

通过 setInterval 定时通过 ajax 从后台获取最新数据,再更改浏览器标题,并通过走马灯的方式显示出来。具体代码如下:

技术分享
(function() {     titleMain();     var id=window.setInterval(titleMain,10000);     var id2;         function titleMain()     {         //console.log(id);         //console.log(id2);         if(id2!=undefined)         {             window.clearInterval(id2);         }         $.ajax({            type: "POST",            url: "__URL__/ajaxTitle/",            success: success         });      }         function success(title)     {         var num = title.length,i = 0;         id2=window.setInterval(titleHandle,200);         //console.log("id2:"+id2);                 function titleHandle()         {            if(i>num)               return (i=0);            document.title = title.substr(i);            i++;         }     }     })();
技术分享

 

功能要实现起来并不难,但有个问题就是存在内存漏泄。一开始我怀疑是第二个套用的 setInterval 引起的,于是将那部分相关的代码注释掉。再观察内存变化情况,同样存在刚才所说的内存问题。 很明显示是不断重复执行 ajax 引起的。自己找不出解决的办法,于是 google 看是否也有人遇到我这样的情况的。找到一篇文章说是 ajax 创建时 new ActiveXObject 导致内存不断增长的(Link)。文中所说的方法是将 ajax 缓存起来,这样就不用每次都创建 new ActiveXObject 对象了,由于我用的代码是 jquery 框架里的,不知怎样缓存。再是决定用原生 javascript 来实现。修改后代码如下:

技术分享
(function() {     var ajax = createAjax();     titleMain();     var id=window.setInterval(titleMain,10000);     var id2;             function titleMain()     {         //console.log(id);         //console.log(id2);         if(id2!=undefined)         {             window.clearInterval(id2);         }                        ajax.open("POST", "__URL__/ajaxTitle/", true);         ajax.onreadystatechange = success;         ajax.send(null);        }         function success()     {         if (ajax.readyState == 4)         {             if (ajax.status == 200)             {                 //return;                 //alert(ajax.responseText);                 var title = ajax.responseText;                 var num = title.length,i = 0;                                 function titleHandle()                 {                    if(i>num)                       return (i=0);                    document.title = title.substr(i);                    if(window.parent!=undefined)                        window.parent.document.title = document.title;                    i++;                 }                                 id2=window.setInterval(titleHandle,200);                 //console.log("id2:"+id2);                             }         }     }     })();

setInterval、ajax 并用引发的内存漏泄

标签:

原文地址:http://www.cnblogs.com/danmohendt/p/4379196.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!