jQuery .animate chains,callbacks和.stop(true,true)

所以我有一个动画链(.animate()。animate()。animate()),在最后一个.animate()上,有一个回调来做一些清理工作。

动画由地址变化中的散列(#page1,#page2等)触发 – 所以当用户快速更改历史状态时,如果有当前正在执行的动画,则需要停止以便它们不会排队。 问题是,如果我添加.stop(true,true),它只会跳转到当前正在运行的动画的结尾 – 并且只执行其回调(如果有的话)。 我需要的是它跳到所有链接动画的末尾,然后触发所有回调(好吧,实际上只是最后一个)。

这有可能吗? 非常感谢。

答案很简单。 感谢JacobM的灵感。

(function($){ $.fn.extend({ hardStop: function(){ return this.each(function(){ var e = $(this); while (e.queue().length){ e.stop(false, true); } }); } }); })(jQuery); 

$("#element").hardStop();

后期编辑:我注意到在复杂的动画链上,有必要确保完成回调不会向已经“清除”的元素的fx队列添加更多函数(假设原始选择器中包含多个元素):

 (function($){ $.fn.extend({ hardStop: function(){ var stopped = false while (!stopped) { this.each(function(){ var e = $(this); while (e.queue().length){ e.stop(false, true); } }); stopped = true; this.each(function(){ var e = $(this); if (e.queue().length){ stopped = false; } }); } } }); })(jQuery); 

我觉得这个解决方案可以变得更简单……