2011-08-26 24 views
7

鉴于following code.fadeOut()在一个隐藏的元素 - 可能的错误?

<div class='hotel_photo_select'> 
    Hello 
</div> 

<div class='itsHidden' style='display:none'> 
    <div class='hotel_photo_select'> 
     Hello 
    </div> 
</div> 

和:

$('.hotel_photo_select').fadeOut(300); 
$('.itsHidden').show(); 

我希望双方.hotel_photo_select的div被隐藏。但是,当我展示容器时,第二个不会隐藏。

这是一个jQuery的bug?每个元素都应该在fadeOut()之后隐藏。

我认为唯一的解决方案将是这样的:

$('.hotel_photo_select').fadeOut(300, function() { 
    $(this).hide(); 
}); 
$('.itsHidden').show(); 

我觉得这是小于优雅。

+0

我不明白你的问题。你写'$('。itsHidden')。show();'当然会显示一个'Hello'。请澄清一下你的问题。 – Jules

+0

在我看来,$('。hotel_photo_select')。fadeOut(300);应该淡化每一个元素。实际上,隐藏容器内的一个不会隐藏。这是queston,但嘘解决神秘:) – markzzz

回答

2

技术上,对于这种类型的方法,你需要使用'。每()'。然后还可以添加一个检查点,在那里我们确定父代是否可见,如果它不可见,那么我们使其可见。

但是,使父项可见,可能会对布局产生负面影响,YES。但没有更好的方法来做到这一点,因此你应该避免这种情况。

活生生的例子:http://jsfiddle.net/QMSzg/21/

$('.hotel_photo_select').each(function() { 
    var this_parent = $(this).parent('div'); 
    if (this_parent.is(':hidden')) { 
     this_parent.show(); 
    } 
    $(this).fadeOut(500); 
}); 
1

jQuery.fadeOut将元素从其当前状态转换为您要采用的状态,在这种情况下隐藏。如果元素已被隐藏(与第二次发生一样),jQuery不需要执行任何操作。你可以做的是专门设置的CSS显示为无:

$('.itsHidden .hotel_photo_select').css('display','none'); 
8

前面已经提到的“嘘”,因为第二个“你好” div的当前状态为“隐藏” jQuery.fadeOut()将不适用任何动画就可以了。

而不是说“淡出为我”,你需要说“使不透明度动画为0”。在这种情况下,jQuery不会在乎你的元素是否可见。它会做的工作:

$('.hotel_photo_select').animate({opacity:0}, 3000); 

看到在这里:http://jsfiddle.net/QMSzg/20/

+1

这里要小心的一件事是,在fadeOut结束时,元素被设置为显示:没有我相信。为了模仿你需要一个完整的处理程序,然后将元素设置为不显示任何内容(取决于之后你在做什么)。 – Alex

+0

是的,谢谢你提到这个。 –

1

地方节目()的淡出()之前

$('.itsHidden').show(); 
$('.hotel_photo_select').fadeOut(300); 
1

我有同样的问题。 我的解决办法是隐藏元素作为一个回调函数:

$('.hotel_photo_select').fadeOut(300, function(){ 
    $('.hotel_photo_select').hide(); 
}); 

这样,如果该元素是隐藏的,回调将马上调用。