2010-05-12 60 views
7

有没有办法判断元素是隐藏的还是当前正在隐藏(通过动画)?我认为这样做的唯一方法是在拨打showhide时在元素的data中存储标志,但我想知道是否有其他方法?jQuery选择器检查元素是否隐藏动画

+0

你怎么会实现这个? – alex 2010-06-03 05:54:48

+0

动画开始时在'data'中设置一个标志,并再次检查该标志。 – nickf 2010-06-03 07:14:26

+0

@nickf啊,解决方案,但不那么优雅!我很想看到你得到自定义选择工作:) – alex 2010-06-03 14:37:54

回答

1

你得到隐藏的一个与$(":hidden"),然后将那些动画与$(":animated")并与:animated检查,如果它有hide方法里面.queue()

+0

我用这段代码检查了队列:'$ el.slideUp('slow'); console.log($ el.queue())'它的所有内容都是'[“进行中”]' – nickf 2010-05-12 01:36:04

+0

那么这就是我可以给你的所有指针 - 可能如果你检查了jQuery源代码,你可能会找到一种方法从队列对象中读取条目。 – 2010-05-12 01:47:20

3

你能否做一个自定义jQuery选择它

(function($) { 
    var endOpacity, 
     oldStep = jQuery.fx.step.opacity; 

    $.fx.step.opacity = function(fx) { 
     endOpacity = fx.end; 

     return oldStep(fx); 
    }; 

$.expr[':'].hiding = function(obj){ 
    var $this = $(obj); 

    return ($this.is(':hidden') || ($this.is(':animated') && endOpacity === 0)); 
}; 

})(jQuery); 

This worked for me(这可能需要一些更多的测试虽然)。

所以只需加上:hiding它会匹配隐藏的元素和当前正在动画为0的元素。它现在只会正在消失,未出现的匹配元素。

+0

这是一个好的开始,但我认为如果存在多个元素,您会遇到问题。看到这个:http://jsbin.com/ojuro3/2/edit - 点击段落使它们淡出并进入。每一秒,隐藏的都是红色的,非隐藏的是蓝色的。 – nickf 2010-06-04 09:14:20

+0

@nickf怎么样,如果你删除元素检查http://jsbin.com/ojuro3/3/edit – alex 2010-06-04 10:54:59

1

您可以检查元素的动画这样的:

if(!$('.your-element').is(':animated')) { 
    // do animation... 
} else { 
    return false; 
}