【问题标题】:jQuery is it ok to explicitly assign the .queue() length property?jQuery 可以显式分配 .queue() 长度属性吗?
【发布时间】:2011-08-23 12:45:14
【问题描述】:

我是 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 的队列走多远,但实际上并没有删除队列中的动画,并可能导致内存泄漏。我实际上想做的只是删除第一个以外的所有排队动画,但似乎找不到这样做的方法。

无论如何,正如我所说,它现在表现完美。谁能告诉我我是不是在做傻事?

【问题讨论】:

  • 我不能 100% 确定分配给长度会达到什么效果,但可能建议不要这样做。它所做的只是返回数组/集合中的项目数,所以如果它在您的示例中工作,我想它可能会弹出项目,这可能会在以后给您带来问题。使用类似于下面 Shankar 的东西,如果你打算使用 jQuery,你最好让它做尽可能多的工作——通常会使代码更干净、更快
  • 是的,我同意,但就像我说的,到目前为止,这是唯一真正提供了所需行为的东西。我会推荐它,如果我能确定我没有破坏什么。我已经测试了很多,没有任何问题,但很高兴知道它没问题

标签: jquery queue


【解决方案1】:

显然分配给长度属性很好:

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

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

这里有好文章:

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

【讨论】:

  • 这是个好消息!好吧,每个人,如果你想避免无休止的动画队列,并且不喜欢使用 stop() 的外观,这个解决方案非常有效 - 取决于你的动画有多复杂(你可能需要更改限制)。非常感谢 timothyclifford,这些链接正是我所需要的,但我没想过只是在 javaScript(而不是 JQuery)网站中寻找答案
  • 不客气。 .length 属性只是普通的旧javascript。 jQuery 的等效项是 .size() 但是由于开销较小,通常首选 .length。更多信息在这里:api.jquery.com/size
【解决方案2】:

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

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

希望对你有帮助。

【讨论】:

  • 谢谢尚卡桑戈里!不幸的是,您建议的解决方案可能会导致鼠标悬停被忽略,并且菜单会永久保留(或者直到您将鼠标悬停在然后再次关闭)。如果我取消第二个函数中的“动画”检查,这个问题就解决了,但是我们又排起了长长的动画队列。问题是,我写的内容确实有效,并给了我想要的行为,但感觉就像一个 hack
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 2015-10-18
  • 2011-05-01
  • 2023-03-14
  • 2011-05-21
  • 2011-02-13
  • 2011-11-03
相关资源
最近更新 更多