Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用AngularJS/jQuery分离DOM树_Jquery_Angularjs_Memory Leaks - Fatal编程技术网

使用AngularJS/jQuery分离DOM树

使用AngularJS/jQuery分离DOM树,jquery,angularjs,memory-leaks,Jquery,Angularjs,Memory Leaks,所以我有一个非常简单的角度应用程序,我试图找出是什么导致分离的DOM树出现在chrome profiler中。例如,当您加载此页面时: 我得到了两个分离的DOM树,一个有2个条目,另一个有3个条目。这个页面不使用任何自定义指令,所以它必须是Angular或jQuery的,但是我没有看到任何会导致这些分离的DOM树的东西 问题变得更大了(如果你点击projects链接并创建另一个概要文件,其中有更多分离的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的角度有多大


有人知道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节点。也许您可以包含更多详细信息,以准确显示何时出现此问题,以及您希望对哪些节点进行垃圾收集。查看此信息是否有帮助