我正在玩$.when
并推迟控制几个功能的流程。我需要弄清楚为什么某些东西不工作以及它应该如何编码才能工作。
这个人为示例的最终目标可以通过内联回调来实现,但这不是我正在寻找的解决方案,因为每个单独的函数都比示例更复杂。最终代码应执行以下操作:
- 动画框 2
- 等一下
- 在框 2 完成后动画框 3 并且有一个短暂的暂停
- 等一下
- 然后在框 3 完成后为框 1 设置动画并且有一个短暂的停顿
- 最后提醒说一切都完成后一切都完成了
我已经尝试了很多变体,但我会尝试展示那些让我最悲伤的变体。在这里找到了一个令人沮丧的小提琴
我从最简单的部分开始,在完成动画的 3 个框后提示一条消息:
var a = $('.box1').animate({top: '100px'}, 2000),
b = $('.box2').animate({top: '100px'}, 1000),
c = $('.box3').animate({top: '100px'}, 2000);
$.when( a, b, c )
.done( function(){ alert( 'all done' )} );
没问题...我实际上开始认为我知道我在做什么...不!
我接下来想,我应该能够将每个变量分离成它自己的函数......但是这使得警报首先发生,然后动画通过忽略它们的动画持续时间而突然结束!
function a(){
$('.box1').animate({top: '100px'}, 2000);
}
function b(){
$('.box2').animate({top: '100px'}, 1000);
}
function c(){
$('.box3').animate({top: '100px'}, 2000);
}
a();
b();
c();
$.when( a(), b(), c() )
.done( alert('all done') );
看起来像一个范围的东西?那么,如果我将 移动$.when
到相应的函数中以调用下一个函数会怎样......再次在现实世界中发生的不仅仅是单个元素动画。
那没有用!为什么?警报再次首先弹出!嗯?然后所有框的动画速度都比指定的快到它们的最终位置:
function a(){
a = $('.box1').animate({top: '100px'}, 2000);
$.when( a ).done( alert( 'all boxes moved down' ) );
}
function b(){
b = $('.box2').animate({top: '100px'}, 1000);
$.when( b ).done( c() );
}
function c(){
c = $('.box3').animate({top: '100px'}, 2000);
$.when( c ).done( a() );
}
b();
通过 jsfiddle 更新 100,我处于堆栈溢出状态......但我想,让我们让它变得更简单,$.when
从每个函数中删除所有函数,然后在我调用b()
触发后添加一个c()
......不幸的是b()
,c()
同时触发了!我在这里想念什么?
function a(){
a = $('.box1').animate({top: '100px'}, 2000);
}
function b(){
b = $('.box2').animate({top: '100px'}, 1000);
}
function c(){
c = $('.box3').animate({top: '100px'}, 2000);
}
$.when( b() ).done( c() );
别介意我认为我可以的事实
$.when( b() ).delay(1000).done( c() );
我正疯狂地试图理解这一点,何时,完成和延迟的东西(如果需要,我可以发布更多内容:)!)在观看了一个小时长的 jquery 开发人员演示文稿之后,我认为我可以在这种情况下实现它。 ..最后我有一个简单的任务,显然我错过了一些东西!我将不胜感激提供的任何方向/解释。
html和css
<div class='boxes'>
<div class='box box1'></div>
<div class='box box2'></div>
<div class='box box3'></div>
</div>
.box{width: 40px; height: 40px; background-color: green; position:absolute;}
.box1{left: 0px;}
.box2{left: 60px;}
.box3{left: 120px;}