jQuery是否可以显式分配.queue()长度属性?

时间:2011-08-23 12:45:14

标签: jquery queue

我是jQuery的新手,我做的第一件事就是我想象的经典任务:为下拉菜单设置动画。 #navBar是一个包含ul的div,当用户将鼠标悬停在li上时菜单会下降。这是代码:

$(document).ready(function()
{
     $("#navBar>ul>li").hover(function()
     {
         var $menu = $(this).find("div");
         if ($menu.queue().length > 1) $menu.queue().length = 1;
         $menu.slideDown(200).css("z-index", "1");
     },
     function()
     {
         $(this).find("div").delay(500).slideUp(400).css("z-index","0");
     });
});

我的问题涉及到这一行:

if ($menu.queue().length > 1) $menu.queue().length = 1;

我这样做是为了避免排队无限动画的问题,同时避免使用stop(true,true)的跳跃性。这非常有效,但我对显式分配队列长度感到不安(我不熟悉的其他编程语言允许我这样做)。

我担心的是,通过分配长度,我只是限制jQuery队列的下行距离,但实际上并没有删除排队的动画,并且可能导致内存泄漏。我真正想做的就是删除第一个以外的任何排队动画,但似乎无法找到办法。

无论如何,正如我所说,它现在表现得很完美。任何人都可以告诉我,如果我做了些蠢事吗?

2 个答案:

答案 0 :(得分:1)

显然分配长度属性很好:

http://www.w3schools.com/jsref/jsref_length_array.asp

如果为数组的length属性赋值小于数组的实际长度,则指定长度后的元素将丢失。

这里有好文章:

http://www.bloggingdeveloper.com/post/JavaScript-Array-Length-Property.aspx

答案 1 :(得分:0)

您正在寻找的是不可能的,您所做的也不会起作用。但是你也可以用不同的方式实现你想要的。尝试这个基本上检查元素是否已经动画不做任何事情让它完成动画。

$(document).ready(function()
{
     $("#navBar>ul>li").hover(function()
     {
         var $menu = $(this).find("div");
         if(!$menu.is(":animated")){
             $(this).find("div").slideDown(200).css("z-index", "1");
         }
     },
     function()
     {
         var $menu = $(this).find("div");
         if(!$menu.is(":animated")){
             $(this).find("div").delay(500).slideUp(400).css("z-index","0");
         }
     });
});

我希望这会对你有所帮助。