我知道在具有大量UI元素的应用程序中正确管理内存并且完全基于Ajax并不容易(在我的应用程序中,页面永远不会重新加载)。 但我想了解以下行为: 我有一个根元素,一次只能附加一个子元素(将其视为根元素是app容器,子元素是单个页面)。 每当我在子内容之间切换时,我都会使用jQuery.remove()删除以前的内容,但我发现内容实际上是从DOM中分离出来的,但它仍保留在内存中。 root和两个子内容(child1和child2) 从child1切换到child2,要求我的应用程序管理员在附加child2之前删除child1 child2正在附加(我可以看到它)但我仍然可以使用管理child1的代码中的child1元素 child1代码(包含对child1 DOM的引用): function testaccess(){ load_and_remove(child2); var child1DOM = get_this_dom(); } child1DOM仍然存在,我可以操作它,好像它仍然附加到DOM。 好吧,我想jQuery.remove()和GC将无法释放内存,直到我有代码可以访问它,但即使我没有调用get_this_dom(),即使退出testaccess(),我看到FF内存不会减少…… 当我退出child1时,我想知道如何让GC释放所有内存。
我试图在我的网站上的http://swip.codylindley.com/DOMWindowDemo.html上找到一个jQuery脚本,当访问者点击链接时创建一个lightbox / domwindow弹出窗口。 不幸的是,当用户关闭dom窗口时,脚本似乎没有释放内存。 如果用户多次打开和关闭窗口,则会导致页面显着减慢并使用户的浏览器崩溃。 这是上面网站的jQuery脚本: (function($){ //closeDOMWindow $.fn.closeDOMWindow = function(settings){ if(!settings){settings={};} var run = function(passingThis){ if(settings.anchoredClassName){ var $anchorClassName = $(‘.’+settings.anchoredClassName); $anchorClassName.fadeOut(‘fast’,function(){ if($.fn.draggable){ $anchorClassName.draggable(‘destory’).trigger(“unload”).remove(); }else{ $anchorClassName.trigger(“unload”).remove(); } }); if(settings.functionCallOnClose) { settings.functionCallAfterClose(); } }else{ var $DOMWindowOverlay = $(‘#DOMWindowOverlay’); var $DOMWindow = $(‘#DOMWindow’); $DOMWindowOverlay.fadeOut(‘fast’,function(){ $DOMWindowOverlay.trigger(‘unload’).unbind().remove(); }); $DOMWindow.fadeOut(‘fast’,function(){ if($.fn.draggable){ $DOMWindow.draggable(“destroy”).trigger(“unload”).remove(); }else{ $DOMWindow.trigger(“unload”).remove(); } }); $(window).unbind(‘scroll.DOMWindow’); $(window).unbind(‘resize.DOMWindow’); if($.fn.openDOMWindow.isIE6){$(‘#DOMWindowIE6FixIframe’).remove();} if(settings.functionCallOnClose){settings.functionCallAfterClose();} […]
我已经尝试了几种方法来使用Phonegap制作一个单页原生应用程序,并且正在寻求关于故障排除的一些一般性建议。 第一种方法:它基本上是一堆不同的页面和子页面,它们将jquery加载到索引页面上的容器中。 因此,没有页面加载,只是使用.load()将页面片段从页面加载到shell中。 第二种方法:我创建了一个包含所有内容的单页html页面,然后根据将导航项的类与内容容器的id匹配来显示和隐藏该页面。 两种方法都可以机械地工作 问题似乎在于我的所有子页面都有一个图库或2-6个图像(所以我总共有超过215个图像,660 x 440),我已经使用了jquery循环,并且Touchwipe以手势激活滚动。 画廊工作正常,但经过一些滚动浏览大约35个画廊后,应用程序总是收到内存警告级别1,然后是2,然后崩溃。 我在仪器中的内存使用似乎没问题…… ajax加载的片段版本保持在2兆字节的活字节数,单页分页器一直保持在5兆字节左右。 画廊由div中的CSS背景图像组成,因为它似乎比标签更好。 我没有看到任何内存泄漏,或者内存警告之外的任何其他问题。 我有点坚持如何追踪这一点。 我已经完成了试验和错误的死亡。 已经将javascript减少到了最基本的要领。 随着时间的推移,似乎正在积累一些东西。 关于如何弄清楚发生了什么的任何想法? 是否有一些第一种方法可以确保javascript不会导致某种类型的内存泄漏? 令人非常沮丧的是,除了iPad之外,整个过程非常有效。 我的下一个策略可能是尝试在不使用时将画廊背景图像重写为空白的gif。 这是我用于单页面的代码: $(document).ready(function(){ document.addEventListener(‘touchmove’, function(e){ e.preventDefault(); }); $(‘div#mainpages > div’).hide(); $(“ul#mainnav li”).click(function() { $(“#mainpages > div”).hide(); var navClass = $(this).attr(‘class’); var target=’#’+navClass; $(target).show(); $(‘[id^=subpages] > div’).hide(); $(target).find(‘[id^=subpages_] div:first’).show(); }); $(‘[id^=subnav] li’).click(function() { $(‘[id^=subnav_] li’).removeClass(‘current’); $(‘[id^=subpages_] […]
我正在开发一个大量使用jquery(UI)的站点,以提供良好的用户体验。 对于某些(愚蠢的)原因,此站点的部分显示在iframe中,并且还有一个用于刷新iframe的按钮以从服务器获取最新数据。 问题是每次刷新iframe时内存使用量都会增加,导致一段时间后出现严重的内存问题(在IE8和9中测试过)。 但这只有在加载jquery库时才会发生。 使用Drip / Sieve时,可以最好地看到此行为。 为了更好地理解这个问题,我删除了导致下面两个文件的所有不必要的代码。 每次重新加载时,内存使用量增加约800 kb。 (如果要重现,请尝试http://jsbin.com/asamid/7 ) 我怎样才能防止jquery吞噬我的记忆? 有没有办法在重新加载之前手动卸载所有jquery? index.htm :(见http://jsbin.com/asamid/7/edit#html,live ) Memory Leak – Parent function reload() { var frame = document.getElementById(“testFrame”); frame.src = “frame.htm”; } reload frame frame.htm :(见http://jsbin.com/ocuval/edit#html,live ) Memory Leak – Frame Test Frame lorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsum
我有一个应用程序,允许用户在回发后查看特定案例的详细信息。 每次用户从服务器请求数据时,我都会下拉以下标记。
我有链接将页面加载到iframe中。 我一直在使用谷歌Chrome的内存堆分析器监视内存中数据的累积,我注意到内存中有一些泄漏。 我加载了页面并拍摄了第一张快照,最多加起来为2.69 MB 。 我点击了将页面打开到iframe的链接,并拍了另一张快照,总共给了我14.58 MB 。 我使用以下jquery代码段删除了iframe: $(‘#myframe’).unbind(); $(‘#myframe’).remove(); /* * By the way, I also tried $(‘#myframe > *’) as a selector. * It still didn’t work. Even if it would, it doesn’t look like a viable solution to me. * It looks too resource intensive. * * I forgot to mention […]