2011-08-23 35 views
3

我是jQuery的新手,我做的第一件事就是我想象的是一个经典任务:为下拉菜单设置动画。 #navBar是一个包含ul的div,当用户将鼠标悬停在li上时,菜单将会下降。下面是代码:jQuery可以明确分配.queue()长度属性吗?

$(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; 

我这样做是为了避免排队无尽的动画的问题,同时避免使用停止的跳动(真,真) 。这是完美的,但我对明确分配队列长度感到不自在(没有其他我熟悉的编程语言允许我这样做)。

我的恐惧是,通过分配长度,我只是限制jQuery队列走多远,但实际上并没有删除排队的动画,并可能导致内存泄漏。我实际上想要做的是简单地删除超出第一个排队的动画,但似乎无法找到一种方法来做到这一点。

无论如何,正如我所说的,它现在表现完美。任何人都可以告诉我,我是否在做一些愚蠢的事情?

+0

我不知道什么分配给长度将达到,但可能建议反对的100%。它所做的只是返回数组/集合中的项目数量,所以如果它在您的示例中有效,我会想象它可能会弹出某些项目,这可能会导致您在稍后的赛道中出现问题。如果你打算使用jQuery,你可以让它做尽可能多的工作 - 通常会使代码变得更干净和更快 – timothyclifford

+0

是的,我同意,但是喜欢我说过,迄今为止,这是唯一实际提供了理想行为的东西。我会推荐它,如果我能确定我没有破坏什么。我已经测试了很多,没有问题,但很高兴知道它没关系 –

+0

请参阅下面的答案... – timothyclifford

回答

1

显然分配给长度属性是细:

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

如果分配一个值到一个数组,其小于所述阵列的实际长度的长度属性,所分配的长度之后的元素迷路了。

这里很好的文章:

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

+0

这真是个好消息!那么,每个人,如果你想避免无尽的动画队列,并不喜欢如何使用stop()看,这个解决方案奇妙地工作 - 取决于你的动画是多么复杂(你可能需要改变极限)。非常感谢timothyclifford,这些链接正是我所需要的,但我没有想过只是在javaScript(而不是JQuery)网站上寻找答案 –

+0

不客气。 .length属性只是普通的旧javascript。 jQuery等价物是.size(),但是.length通常是首选的,因为开销较小。更多信息:http://api.jquery.com/size/ – timothyclifford

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"); 
     } 
    }); 
}); 

我希望这可以帮助你。

+0

Thankyou ShankarSangoli!不幸的是,您建议的解决方案可能会导致忽略掉鼠标,菜单永久保留(或直到您将鼠标悬停然后再次关闭)。如果我在第二个函数中取消了“动画”检查,那么问题就解决了,但是我们又有了长长的动画队列。问题是,我所写的内容确实有效,给了我想要的行为,但感觉像是一种破解 –

相关问题