[英]jQuery code causing memory leak
以下代码导致内存泄漏(您将鼠标悬停在其中的次数越多,看到的越多)。 不幸的是,我无法在我的办公室中下载javascript分析器(我可以,这将花费我几天/几周的时间)。
这是代码,只是下拉菜单的一些简单转换:
$(document).ready(function(){
breadcrumbOver = function () {
$(this).stop().animate({ backgroundColor: "#3393b5", textIndent: 15 }, 250);
}
breadcrumbOut = function () {
$(this).stop().animate({ backgroundColor: "#738793", textIndent: 0 }, 250);
}
$("nav ul li").hover(
function () {
$(this).children('ul.child').stop().slideDown('fast').children('li').hover(breadcrumbOver, breadcrumbOut);
},
function () {
$(this).children('ul.child').stop().slideUp('fast').unbind(breadcrumbOver, breadcrumbOut);
}
);
});
谁能看到可能发生内存泄漏的地方?
编辑:活生生的例子在这里- http://rcnhca.org.uk/sandbox/ (在“健康,安全和保安”反复滚再滚了它的孩子看到效果发生,也动画了slideDown并不有时如果火您可以足够快地滚动进出)。
问题看起来可能在您的初始选择器中。 它以nav
下ul
下的所有li
标签为目标,其中包括所有子孙。
$("nav ul li") ...
这将导致它向nav
下的所有li
标签添加一个hover
回调,然后在您悬停时添加另一个hover
回调。
您可能希望对其进行更具体的说明,例如专门针对直接孩子。
$("nav>ul>li")
如果您有子类,也可以使用:not(.child)
定位所有:not(.child)
类。 使用console.log
(Chrome内置或使用Firebug)记录这些选择器要提取的内容,以确保您获得了期望的结果。
我明白你在谈论乔治。 打开盒子几次后在元素之间快速滑动时,效果最为明显。
也许这会影响您所看到的东西。 我在stop()
上阅读,觉得它可能会对您看到的内容产生影响。 您可以在stop()
指定的第一个属性是clearQueue。 第二个同样有趣。 以下是文档说明的内容:
clearQueue一个布尔值,指示是否也要删除排队的动画。 默认为false。 jumpToEnd一个布尔值,指示是否立即完成当前动画。 默认为false。
可能值得这样传递:
$(this).children('ul.child').stop(true, true)...
// (or you want the animation to unwind, I suppose)
$(this).children('ul.child').stop(true)...
另外,我也检查了取消绑定 ,并且我认为您不能像您一样传递两个事件。 也许您可以通过这种方式使用它,而不会遇到自己的问题:
...unbind(breadcrumbOver).unbind(breadcrumbOut);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.