Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.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
Javascript 导致内存泄漏的jQuery代码_Javascript_Jquery_Memory Leaks - Fatal编程技术网

Javascript 导致内存泄漏的jQuery代码

Javascript 导致内存泄漏的jQuery代码,javascript,jquery,memory-leaks,Javascript,Jquery,Memory Leaks,下面的代码导致内存泄漏(您可以看到这种情况发生的时间越长,进出速度越慢)。不幸的是,我无法在办公室下载javascript分析器(我可以,这只需要几天/几周) 以下是代码,只是下拉菜单的一些简单转换: $(document).ready(function(){ breadcrumbOver = function () { $(this).stop().animate({ backgroundColor: "#3393b5", textIndent: 15 }, 250);

下面的代码导致内存泄漏(您可以看到这种情况发生的时间越长,进出速度越慢)。不幸的是,我无法在办公室下载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);
      }
    );
});
有人能看到内存泄漏可能发生在哪里吗


编辑:此处为实例-(反复翻滚“健康、安全和安保”,然后翻滚它的孩子,以查看效果的发生,而且如果你足够快地滚入滚出,动画slideDown有时也不会触发。)

问题看起来可能在初始选择器中。它针对
nav
ul
下的所有
li
标签,包括所有子代和孙辈

$("nav ul li") ...
$("nav>ul>li")
这会导致它向
nav
下的所有
li
标记添加一个
hover
回调,然后当您悬停时,它会添加另一个
hover
回调

您可能需要更具体地使用它,例如专门针对直接的孩子

$("nav>ul>li")

如果您有子类,还可以使用
:not(.child)
以非子类的所有对象为目标。使用
console.log
(内置于Chrome或使用Firebug)来记录这些选择器正在执行的操作,以确保您得到了预期的结果。

问题看起来可能在您的初始选择器中。它针对
nav
ul
下的所有
li
标签,包括所有子代和孙辈

$("nav ul li") ...
$("nav>ul>li")
这会导致它向
nav
下的所有
li
标记添加一个
hover
回调,然后当您悬停时,它会添加另一个
hover
回调

您可能需要更具体地使用它,例如专门针对直接的孩子

$("nav>ul>li")

如果您有子类,还可以使用
: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);

我明白你在说什么,乔治;当盒子打开几次后在元素之间快速滑动时,效果最为明显

也许这会影响你所看到的。我读了
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);


大多数情况下,我们编写代码的方式会导致内存泄漏。您在浏览器开发工具中看到了什么?如果您观看,您的各种动画可能会向您展示自己。你可以从中看出很多。@veeTrain我只有firebug,它没有什么不寻常的地方,只是抛出了这样一个错误:“WebGL:无法获得可用的WebGL上下文。”这与Modernizer有关,而不是我的脚本。大多数情况下,我们的编码方式会导致内存泄漏。你在浏览器开发工具中看到了什么?如果您观看,您的各种动画可能会向您展示自己。你可以从中看出很多。@veeTrain我只有firebug,它没有什么异常,只是抛出了这样一个错误:“WebGL:无法获得可用的WebGL上下文。”这与Modernizer有关,不是我的脚本。谢谢,我遵循了这个建议,但它仍然在发生。如果你感兴趣,我在if your interest上举了一个活生生的例子。老实说,我看不出这个例子有任何问题。在下拉列表的父对象中来回徘徊了很多次之后,它的子对象的动画变得缓慢而起伏。对我来说不是这样。Win7 Chrome、Fx和IE9运行良好,动画非常流畅,尽管我尝试了很多次欺骗它。谢谢,我遵循了这个建议,但它仍然在发生。如果你感兴趣,我在if your interest上举了一个活生生的例子。老实说,我看不出这个例子有任何问题。在下拉列表的父对象中来回徘徊了很多次之后,它的子对象的动画变得缓慢而起伏。对我来说不是这样。Win7 Chrome、Fx和IE9运行良好,动画非常流畅,尽管我尝试了多少次欺骗它。感谢+1,您关于
unbind()
的说法是正确的,但是即使我只使用
unbind()
,它应该会删除所有绑定的侦听器,问题仍然存在。我还尝试了所有不同的停止参数,但它仍然会变慢=/Bummer…好吧,我希望你可以依靠用户,而不是mo