使用AngularJS/jQuery分离DOM树
所以我有一个非常简单的角度应用程序,我试图找出是什么导致分离的DOM树出现在chrome profiler中。例如,当您加载此页面时: 我得到了两个分离的DOM树,一个有2个条目,另一个有3个条目。这个页面不使用任何自定义指令,所以它必须是Angular或jQuery的,但是我没有看到任何会导致这些分离的DOM树的东西 问题变得更大了(如果你点击projects链接并创建另一个概要文件,其中有更多分离的DOM树和条目),因此我希望如果我能修复这个非常简单的示例,它将在应用程序的其余部分级联 还要注意的是,我使用的是ui路由器,但是我已经用Angular的默认路由器尝试了同样的方法,并且得到了相同的结果。甚至不使用jQuery的todomvc Angular app()也分离了DOM树 更新 我已经将jQuery从应用程序中拉了出来,在我的简单页面上,除了一个分离的dom树之外,所有的dom树都消失了(这一个来自AngularJS,我知道它在哪里)。当我为一个更复杂的页面(带有一个定制指令,该指令有一个templateUrl并进行转换)尝试时,删除jQuery似乎没有什么帮助 我不确定jQuery是否是真正的问题(或者可能是其中的一部分),或者使用jQuery/jqLite的角度有多大使用AngularJS/jQuery分离DOM树,jquery,angularjs,memory-leaks,Jquery,Angularjs,Memory Leaks,所以我有一个非常简单的角度应用程序,我试图找出是什么导致分离的DOM树出现在chrome profiler中。例如,当您加载此页面时: 我得到了两个分离的DOM树,一个有2个条目,另一个有3个条目。这个页面不使用任何自定义指令,所以它必须是Angular或jQuery的,但是我没有看到任何会导致这些分离的DOM树的东西 问题变得更大了(如果你点击projects链接并创建另一个概要文件,其中有更多分离的DOM树和条目),因此我希望如果我能修复这个非常简单的示例,它将在应用程序的其余部分级联 还
有人知道jQuery 1.10.x中是否存在已知的已分离DOM树吗?我花了好几个小时调试许多大型AngularJS应用程序中的DOM节点泄漏 我发现很多分离的DOM元素都不是垃圾收集的,因为jQuery从它保存的一些内部缓存中引用了它们。我确信存在一些角度/jQuery问题 不幸的是,我发现深入研究这个问题很快会产生更多的问题而不是答案(例如,我注意到在我的应用程序中打开/关闭视图会导致分离的DOM元素…但重新打开/关闭不会产生更多)-最后,我不得不做出妥协:
当一个元素被销毁时,我会递归地从其父元素的子元素中删除该元素。
我承认这是一个绝对的黑客行为——但结果是,任何泄漏的DOM元素将不再保留大型元素子树,因此内存泄漏的问题将大大减少
如果你找不到解决这个问题的办法。。。这肯定有助于控制泄漏。我在Chrome中调试内存时遇到过几次问题,如果在启动浏览器时关闭JS优化,这些DOM树还会留在这里吗?使用命令chrome--js flags=“--nocrankshaft--noopt”。我试图为标志找到一个合理的来源,这是我能找到的最好的来源。是的,它们仍然显示分离的dom节点本质上可能是角度的。element()实例化附加到由指令创建的私有变量?假设您有一个带有模板的指令。Angular将创建一个Angular.element并将其注入到link函数中。已编译的模板将被缓存,以便在下一次链接函数执行时重新使用。在我看来,对于大多数指令,至少会有一个分离的dom节点。也许您可以包含更多详细信息,以准确显示何时出现此问题,以及您希望对哪些节点进行垃圾收集。查看此信息是否有帮助