首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

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

2012-03-09 
帮看看ie中运行有没有memory leak 问题function ajax(){}ajax.createXMLHttpRequestfunction(){try{retur

帮看看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);}; 

热点排行