解决 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):"";
}
}
}


猜你喜欢
- 起序:本文是在 python 自己的虚拟环境下做的,不是在 Anaconda 下做的。一、安装想要更改 jupyterlab 的默认启动位置
- 0x00 识别涉及技术验证码识别涉及很多方面的内容。入手难度大,但是入手后,可拓展性又非常广泛,可玩性极强,成就感也很足。验证码图像处理验证
- PyQt5是基于Digia公司强大的图形程式框架Qt5的python接口,由一组python模块构成。PyQt5本身拥有超过620个类和60
- Python的MySQLdb模块是Python连接MySQL的一个模块,默认查询结果返回是tuple类型,只能通过0,1..等索引下标访问数
- 本文实例为大家分享了python地震数据可视化的具体代码,供大家参考,具体内容如下参考源码:seisplot准备工作:在windows10下
- 前言对于前端项目而言,ESLint 可以检查代码,统一代码风格,避免不必要的错误。在 vue3 中配置 ESLint,如下所示。环境vite
- 1、Git Bash默认路径在windows系统上操作Git的客户端是Git Bash。安装完Git Bash之后,双击打开,如下图:使用p
- 好久没有更新过PyQt5相关的专题了,今天正好有空就做一个文件、文件内容检索的小工具。目的是为了能够很快的完成的在任意磁盘路径下找到我们需要
- 一、 迪杰斯特拉算法思想Dijkstra算法主要针对的是有向图的单元最短路径问题,且不能出现权值为负的情况!Dijkstra算法类似于贪心算
- OUTLINE 常见的时间字符串与timestamp之间的转换日期与timestamp之间的转换常见的时间字符串与timesta
- 最近因为要安装Tensorflow,然后发现tensorflow居然不支持python3.7,于是怒而将其降级到3.6以下是具体命令,mar
- I. Strict Mode阐述根据 mysql5.0以上版本 strict mode (STRICT_TRANS_TABLES) 的限制:
- 你应该听说过,应用Python,可以让你处理一天的重复工作量,缩短到几分钟甚至更短。从此解放上班时间,研究更多更有效率的工作方法。进一步提升
- 笔者电脑系统是win7,同时安装了Python2.7和Python3.6,但是在通过命令行直接使用“pip install XXX”安装Py
- Vuex 作为一个老牌 Vue 状态管理库,大家都很熟悉了Pinia 是 Vue.js 团队成员专门为 Vue 开发的一个全新的状态管理库,
- /*存储过程*/ sp_databases --列出服务器上的所有数据库 sp_server_info --列出服务器信息,如字符集,版本和
- 该教程是面向那些不知道如何通过java连接mysql数据库的新手,所以该教程用的方法不是最优的方法,但求是最好理解的方法。需要的工具:ecl
- 前言:因为InnoDB是支持事务的,所以只对InnoDB的事务进行讨论。一、事务(一)什么是事务事务是由一组SQL语句组成的逻辑处理单元,是
- 前言很多时候我们要用到图片上传功能,如果图片一直用放在别的网站上,通过加载网址的方式来显示的话其实也挺麻烦的,我们通过使用 django-f
- 一、开发工具Python版本:3.6.4相关模块:DecryptLogin模块;argparse模块;以及一些python自带的模块。二、环