我是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队列的下行距离,但实际上并没有删除排队的动画,并且可能导致内存泄漏。我真正想做的就是删除第一个以外的任何排队动画,但似乎无法找到办法。
无论如何,正如我所说,它现在表现得很完美。任何人都可以告诉我,如果我做了些蠢事吗?
答案 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");
}
});
});
我希望这会对你有所帮助。