当前位置: 代码迷 >> JavaScript >> 帮看看ie中运行有没有memory leak 有关问题
  详细解决方案

帮看看ie中运行有没有memory leak 有关问题

热度:157   发布时间:2012-03-09 16:54:57.0
帮看看ie中运行有没有memory leak 问题
function ajax()
{
}

ajax.createXMLHttpRequest=function()
{
try 

return new ActiveXObject("Msxml2.XMLHTTP"); 

catch(e) 
{

try 

return new ActiveXObject("Microsoft.XMLHTTP"); 

catch(e) 
{

try 

return new XMLHttpRequest(); 

catch(e) 
{
}
alert("XMLHttpRequest对象无法创建! 请检查浏览器的安全设置! ");
return null; 
};

ajax.synchronous_call=function(a_argument)
{
var url = "DbServlet?timeStamp=" + new Date().getTime();
var xmlHttp=ajax.createXMLHttpRequest();
xmlHttp.open("POST", url, false);
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHttp.send(a_argument);
return eval(xmlHttp.responseText);
};

ajax.asynchronous_call=function(a_argument, a_callback)
{
var url = "DbServlet?timeStamp=" + new Date().getTime();
var xmlHttp=ajax.createXMLHttpRequest();
xmlHttp.open("POST", url, true);
xmlHttp.onreadystatechange = function()
{
if (xmlHttp.readyState == 4) 
{
if (xmlHttp.status == 200) 
{
if(a_callback)
{
a_callback(eval(xmlHttp.responseText));
}
}
xmlHttp=null;
}
};
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHttp.send(a_argument);
};

另外:请教一下ajax.asynchronous_call中的代码在异步方式中会瞬间执行完毕,可是其中的局部变量xmlHttp中对应的onreadystatechange 函数却仍然在有效工作,按常理会被释放无效的!是不是如果IE的GC能力增强之后这样写代码就不能正确执行了?

------解决方案--------------------
可以这样吧

//初始化函数块
var query = function(){} ;

//把方法作为参数传入按顺序直到其中的一个成功执行
var Try = {
these: function() {
var returnValue ;
for (var i = 0, length = arguments.length; i < length; i++)
{
var lambda = arguments[i] ;
try {
returnValue = lambda() ;
break;

catch (e) {}
}

return returnValue ;
}
};
//ajax应用,有xml方法和json方法可以到server端请求并返回数据
var ajax = query.prototype = {
create: function(){
return Try.these(
function() {return new XMLHttpRequest()},
function() {return new ActiveXObject('Msxml2.XMLHTTP')},
function() {return new ActiveXObject('Microsoft.XMLHTTP')}
) || false ;
},
xml: function(sXML , sURL){
var oXML = new ActiveXObject("MSXML2.DOMDocument") ;
oXML.async = false;
oXML.loadXML(sXML);
var xmlResult = this.post(oXML, sURL) ;

return xmlResult.xml ;
},
post: function(oXML , sURL){
var oXmlHttp = this.create() ;
oXmlHttp.Open("POST" , sURL , false) ;
oXmlHttp.Send(oXML) ;

return oXmlHttp.responseXML ;
},
json: function(url , type){
var obj = this.create() ;
obj.open("POST" , url , false) ;
obj.send(null) ;

if (obj.responseText != "") {
if (type == 'text'){
return obj.responseText ;
}
else {
eval("var data = " + obj.responseText) ;
return data ;
}
}
}
};
------解决方案--------------------
IE的内存释放是在于有没有function正在调用你的xmlhttprequest实例。
这里占用xmlhttprequest内存的很明显是

JScript code
ajax.asynchronous_call=function(a_argument, a_callback)
{
var url = "DbServlet?timeStamp=" + new Date().getTime();
var xmlHttp=ajax.createXMLHttpRequest();
xmlHttp.open("POST", url, true);
xmlHttp.onreadystatechange = function()//就这个functiun占用了 xmlHttp导致内存无法释放
{
    if (xmlHttp.readyState == 4) 
    {
        if (xmlHttp.status == 200) 
        {
            if(a_callback)
            {
                a_callback(eval(xmlHttp.responseText));
            }
        } 
        xmlHttp.onreadystatechange = null; //在这里多加一条应该就可以完全释放内存了
        xmlHttp=null;
    }
};
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHttp.send(a_argument);
}; 
  相关解决方案