Javascript 避免将内容加载到iframe时内存泄漏

Javascript 避免将内容加载到iframe时内存泄漏,javascript,performance,jquery,iframe,Javascript,Performance,Jquery,Iframe,我正在开发一个在iframe中显示内容的嵌入式系统。它使用signar(基于ajax)和jquery。随着时间的推移,浏览器速度越来越慢,内存使用率也越来越高。因此,我希望消除所有潜在的内存问题 当新页面加载到iframe中时,我附加了click和focus事件处理程序 就在iframe页面被替换之前,我将其卸载 但是,如果我检查$.cache(在使用firefox的PC上进行测试时,与我的实际系统不完全相同),它仍然会显示$.cache在每次重新加载iframe时获得越来越多的元素 这是正确的

我正在开发一个在iframe中显示内容的嵌入式系统。它使用signar(基于ajax)和jquery。随着时间的推移,浏览器速度越来越慢,内存使用率也越来越高。因此,我希望消除所有潜在的内存问题

当新页面加载到iframe中时,我附加了click和focus事件处理程序

就在iframe页面被替换之前,我将其卸载

但是,如果我检查$.cache(在使用firefox的PC上进行测试时,与我的实际系统不完全相同),它仍然会显示$.cache在每次重新加载iframe时获得越来越多的元素

这是正确的做事方式吗?还有什么我可以试试的吗?美元缓存为什么在增长

(如果您感兴趣,我将使用raspberry pi(运行linux)和Midori浏览器,尽管我可以选择其他(主要是web工具包)浏览器)

我用来更改iframe内容的Javascript

hubProxy.client.loadPage = function (pageFilename, pageType) {
    frameNode = $("#myIframe").contents();
    $("a", frameNode).off();  
    $("#myIframe")[0].src = pageFilename;
};

编写一个包装器div来保存iframe容器,例如

<div id="myIframeWrapper"></div>

现在可以在上一个iframe页面之后进行清理,这可以通过完全清除DOM中与上一个iframe相关的所有内容来完成,然后在调用loadPage函数时使用构造函数创建一个新的iframe

hubProxy.client.loadPage = function (pageFilename, pageType) {

    var myNewIframe = '<iframe id="myIframe" src="' + pageFilename + '"></iframe>';

    // Remove old iframe from the DOM and replace with new iframe
    if ($("#myIframe")) {
        $("#myIframeWrapper").empty().append( myNewIframe );
    }

    var frameNode = $("#myIframe").contents();
    $("a", frameNode).off();
};
hubProxy.client.loadPage=函数(页面文件名,页面类型){
var myNewIframe='';
//从DOM中删除旧的iframe并替换为新的iframe
如果($(“#myIframe”)){
$(“#myIframeWrapper”).empty().append(myNewIframe);
}
var frameNode=$(“#myIframe”).contents();
$(“a”,frameNode).off();
};

您将注意到,分配iframe源的原始行已被删除,因为它已在新构造函数中进行了说明。这还有一个好处,即可以使用构造函数添加其他iframe属性,如iframe大小等。

您正在全局存储frameNode,这是有意的吗?@kevinb:重新使用globals实际上会减少未收集的垃圾。将条目添加到缓存的唯一时间是将事件或数据添加到元素时,当jquery删除该元素时,它将被清除。因为您只是更改iframe的src,所以很可能没有进行清理。这是我的第一个猜测,没有看到更多的代码或去src。测试方法是用
替换
.off()
.remove()
@Kevin B,不,不是要成为一个全球性的,谢谢你的发现that@KevinB,我不明白你最后的评论。当你说“因为你只是在改变iframe的src,很可能清理没有发生”你是说清理没有发生是可以理解的,我应该做更多的工作来促进清理吗?或者你是说它没有发生,但它应该发生?没有使用任何包装器的任何其他替代方案?