各位大侠请帮忙--在线等--十万火急--JS导致IE浏览器内存泄漏问题 回复楼上的已经测试出来了在每次send请求时,ajax对象未释放资源。。就是一次send就创建一次对象希望各位大侠能否帮我改一下这个ajax.js的这个库 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 关键是实例化这段代码_getInstance:function(){ for(var i=0;i <this._objPool.length;i++){ if(this._objPool[i].readyState ==0||this._objPool[i].readState==4){ return this._objPool[i]; } } this._objPool[this._objPool.length] = this._createObj(); return this._objPool[this._objPool.length-1]; }, 总是create新的对象。。总是走 “this._objPool[this._objPool.length] = this._createObj(); return this._objPool[this._objPool.length-1]; ”这个代码,不能重复利用对象 对象池this._objPool[]//不加限制的增大,这样会撑坏内存可以重载对象啊_objPool: []数组池换成可以覆盖的对象;_ajaxObj: null然后用的时候覆盖就可以了;this._ajaxObj= this._createObj(); 或者你在每一次用完this._objPool[]的时候都给objPool晴空 1、可以缓存objXMLHttp对象,重复利用2、通过objXMLHttp == null;CollectGarbage();来回收不再使用的资源。 你好。各位楼上的楼上十分感谢。。请问“对象池this._objPool[]//不加限制的增大,这样会撑坏内存 可以重载对象啊 _objPool: []数组池换成可以覆盖的对象; _ajaxObj: null 然后用的时候覆盖就可以了; this._ajaxObj= this._createObj(); 或者你在每一次用完this._objPool[]的时候都给objPool晴空”这个我不太明白,,具体代码加载在哪里啊? 请问CollectGarbage()这个函数直接放在ajax库中吗? 更改成对象 在代码上更改的多.清空的那个加这里_getInstance:function(){ if(this._objPool[0].readyState ==0||this._objPool[0].readState==4){ return this._objPool[0]; } this._objPool[0] = this._createObj(); return this._objPool[0]; }这样简单些 改对象的var XMLHttp = { _xmlHttpObj: null, _getInstance:function(){ if(this._xmlHttpObj.readyState ==0||this._xmlHttpObj.readState==4){ return this._xmlHttpObj; } this._xmlHttpObj = this._createObj(); return this._xmlHttpObj; }, _createObj:function(){ if(window.XMLHttpRequest){ var objXMLHttp = new XMLHttpRequest(); }else{ var MSXML = ['MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP']; for(var n = 0;n < MSXML.length;n++){ try{ var objXMLHttp = new ActiveXObject(MSXML[n]); break; }catch(e1){ } } } if(objXMLHttp.readyState == null){ objXMLHttp.readyState = 0; objXMLHttp.addEventListener("load",function(){ objXMLHttp.readyState ==4; if(typeof objXMLHttp.onreadystatechange =='function'){ objXMLHttp.onreadystatechange(); } },false); } return objXMLHttp; }, sendReq:function(method,URL,data,callback){ var objXMLHttp = this._getInstance(); with(objXMLHttp){ try{ if(URL.indexOf("?")>0){ URL += "&randnum=" + Math.random(); }else{ URL += "?randnum=" + Math.random(); } open(method,URL,true); //setRequestHeader('Content-Type','application/x-www-form-urlencoded;charset=UTF-8'); setRequestHeader("Content-Type","text/xml"); send(data); onreadystatechange = function() { if((objXMLHttp.readyState == 4)&&(objXMLHttp.status == 200||objXMLHttp.status ==304)) { callback(objXMLHttp); objXMLHtt=null;//还要加上清空} } }catch(E){ alert(E); } } } }; 另外你应该在 变量会不会冲突 比如你上面那个getCallbackFunc里的XMLHttp.sendReq('POST',url ,data, getCallbackFunc); XMLHttp是哪儿来的 下面AJAX函数库这样写的 var XMLHttp = { ... } 我觉得你的"AJAX"函数库有问题 下面objXMLHttp对象创建后你怎么在外部调用? _createObj:function(){ if(window.XMLHttpRequest){ var objXMLHttp = new XMLHttpRequest(); }else{ var MSXML = ['MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP']; for(var n = 0;n < MSXML.length;n++){ try{ var objXMLHttp = new ActiveXObject(MSXML[n]); break; }catch(e1){} } 这里的objXMLHttp从何而来? if(objXMLHttp.readyState == null){... 11楼疑问_createObj:function(){ if(window.XMLHttpRequest){ var objXMLHttp = new XMLHttpRequest(); }else{ var MSXML = ['MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP']; for(var n = 0;n < MSXML.length;n++){ try{ var objXMLHttp = new ActiveXObject(MSXML[n]); break; }catch(e1){ } } } if(objXMLHttp.readyState == null){ objXMLHttp.readyState = 0; objXMLHttp.addEventListener("load",function(){ objXMLHttp.readyState ==4; if(typeof objXMLHttp.onreadystatechange =='function'){ objXMLHttp.onreadystatechange(); } },false); } return objXMLHttp; }着是整个的方法 return objXMLHttpvar objXMLHttp = new XMLHttpRequest(); 或var objXMLHttp = new ActiveXObject(MSXML[n]); 当然,楼主这么写不和标准应当先声明变量,再赋值var objXMLHttp = null; objXMLHttp = new XMLHttpRequest(); objXMLHttp = new ActiveXObject(MSXML[n]); 尽管你try了一下.若的不到 objXMLHttp 下面也回报错的 谢谢各位。我改改实验一下,但是我一写objXMLHttp=null;就包语法错误啊 你好楼上的_xmlHttpObj: null, _getInstance:function(){ if(this._xmlHttpObj.readyState ==0||this._xmlHttpObj.readState==4){ return this._xmlHttpObj; } this._xmlHttpObj = this._createObj(); return this._xmlHttpObj; }, 这段代码报错,this._xmlHttpObj has no properties 请问这个是怎么回事啊?麻烦在看一下 晕 只在ie下测了.初始化变量的时候没有指定类型; 因为this._xmlHttpObj为null了,故没有readyState和readState 这个属性,无妨,做下判断,_getInstance:function(){ if(this._xmlHttpObj!=null && (this._xmlHttpObj.readyState ==0||this._xmlHttpObj.readState==4)){ return this._xmlHttpObj; } this._xmlHttpObj = this._createObj(); return this._xmlHttpObj; }, scrollbar自定义滚动条插件如何制作 jquery中的click如何传递不同的参数? 急~~~~~ 一个简单问题,大家帮忙看看。 JS好不好学啊,有没有什么资料库啊?? 高手请进 有关javascript 如何执行外部命令的问题 ? 为什么不能正常统计checkbox的个数? 怎么让 iframe 的高度自动根据 iframe 里面页面的内容的高度来调整? 求助,关于Com的问题 高分求3宝 ie7.0下 window.open为什么地址栏不消失呀? jquery怎样判断多个CheckBox是否被选中, attr只能判断第一个
for(var i=0;i <this._objPool.length;i++){
if(this._objPool[i].readyState ==0||this._objPool[i].readState==4){
return this._objPool[i];
}
}
this._objPool[this._objPool.length] = this._createObj();
return this._objPool[this._objPool.length-1];
}, 总是create新的对象。。总是走 “this._objPool[this._objPool.length] = this._createObj();
return this._objPool[this._objPool.length-1]; ”这个代码,不能重复利用对象
可以重载对象啊
_objPool: []数组池换成可以覆盖的对象;
_ajaxObj: null
然后用的时候覆盖就可以了;
this._ajaxObj= this._createObj();
或者你在每一次用完this._objPool[]的时候都给objPool晴空
2、通过objXMLHttp == null;CollectGarbage();来回收不再使用的资源。
“对象池this._objPool[]//不加限制的增大,这样会撑坏内存
可以重载对象啊
_objPool: []数组池换成可以覆盖的对象;
_ajaxObj: null
然后用的时候覆盖就可以了;
this._ajaxObj= this._createObj();
或者你在每一次用完this._objPool[]的时候都给objPool晴空”这个我不太明白,,具体代码加载在哪里啊?
请问CollectGarbage()这个函数直接放在ajax库中吗?
清空的那个加这里
_getInstance:function(){
if(this._objPool[0].readyState ==0||this._objPool[0].readState==4){
return this._objPool[0];
} this._objPool[0] = this._createObj();
return this._objPool[0];
}这样简单些
_xmlHttpObj: null, _getInstance:function(){
if(this._xmlHttpObj.readyState ==0||this._xmlHttpObj.readState==4){
return this._xmlHttpObj;
}
this._xmlHttpObj = this._createObj();
return this._xmlHttpObj;
}, _createObj:function(){
if(window.XMLHttpRequest){
var objXMLHttp = new XMLHttpRequest();
}else{
var MSXML = ['MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
for(var n = 0;n < MSXML.length;n++){
try{
var objXMLHttp = new ActiveXObject(MSXML[n]);
break;
}catch(e1){ }
}
} if(objXMLHttp.readyState == null){
objXMLHttp.readyState = 0;
objXMLHttp.addEventListener("load",function(){
objXMLHttp.readyState ==4;
if(typeof objXMLHttp.onreadystatechange =='function'){
objXMLHttp.onreadystatechange();
}
},false);
}
return objXMLHttp;
},
sendReq:function(method,URL,data,callback){
var objXMLHttp = this._getInstance();
with(objXMLHttp){
try{
if(URL.indexOf("?")>0){
URL += "&randnum=" + Math.random();
}else{
URL += "?randnum=" + Math.random();
}
open(method,URL,true);
//setRequestHeader('Content-Type','application/x-www-form-urlencoded;charset=UTF-8');
setRequestHeader("Content-Type","text/xml");
send(data);
onreadystatechange = function()
{
if((objXMLHttp.readyState == 4)&&(objXMLHttp.status == 200||objXMLHttp.status ==304))
{
callback(objXMLHttp);
objXMLHtt=null;//还要加上清空
}
}
}catch(E){
alert(E);
}
}
}
};
另外你应该在
比如你上面那个getCallbackFunc里的XMLHttp.sendReq('POST',url ,data, getCallbackFunc);
XMLHttp是哪儿来的 下面AJAX函数库这样写的
var XMLHttp = {
... } 我觉得你的"AJAX"函数库有问题
下面objXMLHttp对象创建后你怎么在外部调用?
_createObj:function(){
if(window.XMLHttpRequest){
var objXMLHttp = new XMLHttpRequest();
}else{
var MSXML = ['MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
for(var n = 0;n < MSXML.length;n++){
try{
var objXMLHttp = new ActiveXObject(MSXML[n]);
break;
}catch(e1){}
} 这里的objXMLHttp从何而来?
if(objXMLHttp.readyState == null){
...
if(window.XMLHttpRequest){
var objXMLHttp = new XMLHttpRequest();
}else{
var MSXML = ['MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
for(var n = 0;n < MSXML.length;n++){
try{
var objXMLHttp = new ActiveXObject(MSXML[n]);
break;
}catch(e1){ }
}
} if(objXMLHttp.readyState == null){
objXMLHttp.readyState = 0;
objXMLHttp.addEventListener("load",function(){
objXMLHttp.readyState ==4;
if(typeof objXMLHttp.onreadystatechange =='function'){
objXMLHttp.onreadystatechange();
}
},false);
}
return objXMLHttp;
}
着是整个的方法 return objXMLHttp
var objXMLHttp = new XMLHttpRequest();
或
var objXMLHttp = new ActiveXObject(MSXML[n]);
应当先声明变量,再赋值
var objXMLHttp = null;
objXMLHttp = new XMLHttpRequest();
objXMLHttp = new ActiveXObject(MSXML[n]);
尽管你try了一下.若的不到 objXMLHttp
下面也回报错的
_xmlHttpObj: null, _getInstance:function(){
if(this._xmlHttpObj.readyState ==0||this._xmlHttpObj.readState==4){
return this._xmlHttpObj;
}
this._xmlHttpObj = this._createObj();
return this._xmlHttpObj;
},
这段代码报错,this._xmlHttpObj has no properties 请问这个是怎么回事啊?麻烦在看一下
初始化变量的时候没有指定类型;
因为this._xmlHttpObj为null了,故没有readyState和readState 这个属性,
无妨,做下判断,_getInstance:function(){
if(this._xmlHttpObj!=null && (this._xmlHttpObj.readyState ==0||this._xmlHttpObj.readState==4)){
return this._xmlHttpObj;
}
this._xmlHttpObj = this._createObj();
return this._xmlHttpObj;
},