HTML代码
<div id="foo">
<h1>foo</h1>
<p>Pellentesque habitant morbi tristique.</p>
</div>
<div id="bar">
<h1>bar</h1>
</div>
jQuery代码
$('#bar').click(function () {
$('#foo p').hide('slow').appendTo('#bar').show('slow');
})
预期结果
当点击#bar
- 隐藏
p
在元件#foo
- 追加
p
到#bar
- 显示
p
也就是现在的孩子#bar
实际结果
- 追加
p
到#bar
- 隐藏
p
在元件#foo
- 显示
p
也就是现在的孩子#bar
问题
- 是什么决定的方法在jQuery的链执行顺序?
- 我怎么能保证每个事件的下一个开始前完成?
如果你想等到每个动画做下一步之前完成,使用中详述的动画回调的文档 :
$('#bar').click(function () {
$('#foo p').hide('slow', function(){
$(this).appendTo('#bar').show('slow');
});
});
为了确保您执行类似隐藏或显示效果后,使用回调。 http://docs.jquery.com/Effects/show#speedcallback
加上:
文森特是正确的,执行实际上是
- 开始躲在#foo p元素(缓慢地)
- 附加p来#bar(以卡扣)
- 开始显示P,其是现在#bar的子(缓慢地)
你所看到的是效果的结果
- 附加p来#bar(执行)
- 隐藏在#foo p元素(已完成)
- 节目P,其现在是#bar的孩子(已完成)
预期的结果是正确的。 所观察到的行为可能是隐藏(“慢”),该异步运行的结果。 所以它运行,而下一个动作执行。 因此,它看起来好像p被追加首先#bar。 你可以尝试隐藏()不慢,看看是否有差别。
show()
和hide()
实际上是动画效果,但是当没有传递参数,他们使用“即时”的持续时间。 然而,由于这一事实,他们正在为动画实现的,这意味着它们不与函数链同步执行。 因此,你真的应该使用什么是回调掉的hide()
调用来触发它调用回调函数append()
然后show()
http://docs.jquery.com/Effects/show
http://docs.jquery.com/Effects/hide
隐藏是异步的。 如果你想等待它完成,你需要把所有你想要后,碰到你传递给隐藏作为参数的回调函数的代码。
肯定它的在执行时的顺序执行的,它可能开始隐藏部分和一秒钟后它附加到其他元素,但动画部分已经开始,它需要更长的时间超过一毫秒,因为你把它设置为“慢”和它的跳跃不透明度从1到0,以毫秒为单位,从1说要1.9至0.8。
$.fn.hide = function() { alert('hiding'); return this; };
$.fn.appendTo = function() { alert('appending To') }
$('body').hide().appendTo('html')
你有,如果你想要一个像“Sixten奥托”曾表示要排队的显示隐藏的事情后运行其他方法使用回调。 显示隐藏的动画不会等待追加的方法来执行。 而在此期间,其他代码调用它开始的setInterval一个单独的线程。 所以,你得到的结果并不意外。