网络编程
位置:首页>> 网络编程>> JavaScript>> 解决 myJSFrame 框架中 Ajax 方法一处明显的内存泄露

解决 myJSFrame 框架中 Ajax 方法一处明显的内存泄露

作者:快乐笛子 来源:快乐笛子的博客 发布时间:2008-03-09 19:14:00 

标签:myJSFrame,内存,ajax,框架

 一直以来,每次调用Ajax方法都需要创建一次 Microsoft.XMLHTTP 对象,今天在使用Ajax技术做一个类似聊天室的demo时,发现即使没有发生任何的 DOM 动作,IE的内存占用量却一直递增。从十几M飙升到150M,因为我在页面中使用了 setInterval 函数,如果时间周期越短,内存消耗量就增加得越快。

从demo程序本身开始查,一直追查到底层的 myJSFrame 框架,发现内存的消耗发生在 new ActiveXObject('Microsoft.XMLHTTP') 的动作上,每次创建的 xmlhttp 对象都一直驻留在内存当中,只有把IE窗口最小化后内存才被回收。

郁闷了老半天,翻阅 prototype.js 亦无果,突然想到了缓存,既然无法手动回收内存,那可以把 xmlhttp 对象缓存起来嘛,页面中第一次创建的 xmlhttp 对象缓存到 ajax 对象的属性中去,第二次创建 xmlhttp 时就使用缓存中的对象!哈哈,果然,任务管理器里IE的内存占用量就停止增加了~~

 

var Ajax={
 xmlhttp:function (){
  var obj = null; 
  try{
   obj = new ActiveXObject('Msxml2.XMLHTTP');
  }catch(e){
   try{
    obj = new ActiveXObject('Microsoft.XMLHTTP');
   }catch(e){
    obj = new XMLHttpRequest();
   }
  }
  return Ajax.xmlObjCache = obj;
 },xmlObjCache:null
};
Ajax.Request=function (){
 if(arguments.length<2)return ;
 var para = {asynchronous:true,method:"GET",parameters:""};
 for (var key in arguments[1]){
  para[key] = arguments[1][key];
 }
 var _x=Ajax.xmlObjCache || Ajax.xmlhttp();
 var _url=arguments[0];
 if(para["parameters"].length>0) para["parameters"]+='&_=';
 if(para["method"].toUpperCase()=="GET") _url+=(_url.match(/\?/)?'&':'?')+para["parameters"];
 _x.open(para["method"].toUpperCase(),_url,para["asynchronous"]);
 _x.onreadystatechange=Ajax.onStateChange.bind(_x,para);
 if(para["method"].toUpperCase()=="POST")_x.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
 for (var ReqHeader in para["setRequestHeader"]){
  _x.setRequestHeader(ReqHeader,para["setRequestHeader"][ReqHeader]);
 }
 _x.send(para["method"].toUpperCase()=="POST"?(para["postBody"]?para["postBody"]:para["parameters"]):null);
 return _x;
};
Ajax.onStateChange = function(para){
 if(this.readyState==4){
  if(this.status==200)
   para["onComplete"]?para["onComplete"](this):"";
  else{
   para["onError"]?para["onError"](this):"";
  }
 }
}
0
投稿

猜你喜欢

  • 是的,这仅仅是一个PPT文档,由Anna Debenham上传至slideshare。幻灯片的标题叫做《CSS nuggets》,嗯,很好的
  • 国外的空间和我们国内的空间使用的语言系统一般不一样,所以在网页程序上时如果处理不当很容易出现乱码,看了让人摸不着头脑。所以我们在编写程序时就
  • 个人网站如有会员注册模块+动网论坛的话,那网站要与动网论坛系统整合,实现不同Web系统之间的用户信息同步更新、登录等操作就不是件容易的事了,
  • 组合集总计: group by with rollup/cube grouping sets 子查询按执行方式分:标准子查询、关联子查询 标
  • MySQL使用于认证目的的用户名,与Unix用户名(登录名字)或Windows用户名无关。缺省地,大多数MySQL客户尝试使用当前Unix用
  • 在网页设计中有一些通用的交互设计模式。网站导航各种各样的通用和大家熟知的设计模式,可以用来作为为网站创建有效地信息架构的基础。这篇指南涵盖了
  • 如果您刚刚开始接触网页设计,是不是经常发生这样的问题呢?做好的网页在自己机器上可以正常浏览,而把页面传到服务器上就总是出现看不到图片,css
  • MaxDB和MySQL是独立的数据库管理服务器。系统间的协同性是可能的,通过相应的方式,系统能够彼此交换数据。要想在MaxDB和MySQL之
  • 微软在今天早上发布新的安全通告证实,一处远程执行代码漏洞影响到了整个SQL Server产品线。该漏洞的入侵代码在两周前已经被公布在互联网上
  • 阅读上一章:Chapter 7 锚点 Chapter 8 再谈清单先前在第一章,我们讨论过几种标记清单的做法,研究以<ul>和&
  • 使用SQL SERVER的[导入]功能,便可将access数据转换,但要注意原来的'自增字段'需要修改,将相应字段标识修改为
  • 最近看到好多人说到tns或者数据库不能登录等问题,就索性总结了下面的文档。首先来说Oracle的网络结构,往复杂处说能加上加密、LDAP等等
  • 背景:pony是公司的首席体验官、首席产品经理。这次在产品峰会上pony将自己平时经验的积累与大家交流,体验较细。这次分享研发管理部,设计中
  • 我们在工作中经常强调沟通能力,和产品、开发、测试等不同角色的人需要沟通,和领导、同事需要沟通,沟通是一个双向的过程,而沟通首先需要双方有良好
  • char、varchar、text和nchar、nvarchar、ntext的区别1、CHAR。CHAR存储定长数据很方便,CHAR字段上的
  • 在SQL Server数据库中,有min server memory与max server memory两个内存选项。数据库管理员合理设置这
  • 【作者翻译】结构和层次降低了复杂性并提高了可读性。你的文章或站点组织的越深入,用户就越容易理解你观点和得到你想传达的信息。在网页上,这点被通
  • 曾有位网友遇到这样一个问题:产品名称为“A&T Plastic”,在产品列表中需要做这样的超链接,<a href="
  • 我用的数据库是Access2000的,系统为Win2000 Advance Server.今天在程序调试中遇到了以下几个怪现象:1.如果Ac
  • 前提条件:1.安装好Wampserver64(版本不限)2.Wampserver64软件启动后 变为绿色如:3.在数据库里面创建好名为&am
手机版 网络编程 asp之家 www.aspxhome.com