对于这个项目,我有一个盒子(div),其中包含一些静态内容(包括制表符)和可以在各种条件下更改的内容(点击,悬停,和定时器)。这些动态内容视图中的每一个都位于独立的div中。JQuery:在淡出多个对象后淡入导致闪烁
我想写一个函数,可以处理所有这些情况,包括页面的初始加载,因为所有的动态内容最初都隐藏在CSS中。这个函数使用父框,它必须被修改以跟踪事物,以及我希望改变的视图。因此,我首先淡出所有的观点,确保没有任何东西存在,然后淡入淡出新视图。我很快就意识到回调没有按照顺序工作,所以我碰到了promise()函数。不幸的是,这会在我尝试过的每个浏览器(IE,Chrome和Firefox)中产生闪烁。在Chrome中,这种情况只有每隔一段时间才会发生,而在其他情况下则几乎不变。
$(container).children('.content_view').fadeOut(transition);
$(container).children('.content_view').promise().done(function() {
$(next).fadeIn(transition);
});
这就是我现在的代码的业务结束。有没有更好的方法来做到这一点,或者有什么方法来消除闪烁?不幸的是,这个页面大多会在不正常的浏览器中查看。
在玩弄延迟后,我怀疑问题是时间问题。过早移除某个元素或出现另一个元素会导致我的布局暂时发生变化,直到达到最终布局。我怀疑promise()函数实现了这样的延迟。
编辑:
我发现,似乎也为我工作的解决方案。由于我最初的淡出是为了处理多个视图以某种方式未被隐藏的事件(这是由于其他原因发生的,使用mouseenter和mouseleave而不是mouseover和mouseout)我决定尝试立即杀死会更好任何正在从先前呼叫中消失的过程中,然后执行我的正常褪色:
$(container).children('.content_view').filter(function(){return ($(this).css('opacity') < 1)}).each(function() {
$(this).stop();
$(this).css('opacity',0);
$(this).css('hidden','none');
});
if ($(container).children('.content_view').filter(function(){return ($(this).css('display') != 'none');}).length > 0)
$(container).children('.content_view').filter(function(){return ($this.css('display') != 'none';}).fadeOut(transition, function() {
$(content).fadeIn(transition);
});
else
$(content).fadeIn(transition);
希望是有道理的。我以前不知道过滤功能。相当方便:)
请注意,在我的情况下,这是有效的,因为这是任何内容交换的唯一方式,它只会留下一个元素树完全可见(或到达那里)在每个呼叫。如果下一个还没有完成,它会立即死亡并被取代。
你可以放在一起复制这个JSFiddle? – Jon 2012-04-11 11:43:43
我在努力。噢亲爱的。似乎崩溃了很多:P – user1215288 2012-04-11 12:05:33