3

如果 msg.d 开始从 'true' 返回 'false' 直到有足够的时间让动画停止,它当前的编写方式会导致 hide 一次又一次地触发。

有没有isHiding之类的?

提前致谢!

if(msg.d == "true") {
    if(!$("#addContactEmailError").is(":visible")) {
         $("#addContactEmailError").show('bounce');
    }
    $("#addContactSubmitButton").attr("disabled", true);
}
else {
    if($("#addContactEmailError").is(":visible")) {
         $("#addContactEmailError").hide('slide', { direction: "up" });
    }
    $("#addContactSubmitButton").attr("disabled", false);
}

编辑 1

这一切都在一个 keyup 处理程序中。

编辑 2

使用动画仅在完成时触发动画。如果 msg.d 更改,但现在不正确的动画尚未完成,则不会触发正确的动画。

蹩脚的解决方案

我使用全局布尔值来跟踪状态。我讨厌那样做。尽可能提供赏金以获得更好的解决方案。谢谢大家!

取消赏金

对不起,伙计们,没有意识到我必须和自己的代表一起购买。:(

4

4 回答 4

2

如果你想要stop一个动画,中间动画,并让它从那个stopped css 状态移动到另一个,使用 ,最重要的是,stop(true, false).

底线:stop(true,false)“神奇地”停止动画在其轨道上,但认为 css 设置为任何停止动画的 css 参数,因此您可以从该点继续,而无需尝试猜测或弄清楚您应该如何从stopped制作动画观点。

换句话说,如果你设置了 css through animate,但你stopped 它,动画元素将保持在任何 css 状态stop,但在stopped 动画中输入的 css 设置将是当前 css 设置,直到更改。

这是关键。您不必猜测stop离开 css 状态的位置。您可以继续返回,就好像您的动画完全完成一样。

这是这个概念基础的演示:http: //jsfiddle.net/dYYZP/65/


从这里撕掉基础动画:Jquery 分层动画从下面滑出


后记

由于animateabsolute定位 、 和 中relative的定位offset很容易stop(true,false),我很少使用任何内置动画。他们太笨重了,不知道你真正需要什么。它们非常适合最基本的动画,但如果你想让你的页面闪耀,上面的那些概念(我可能会很容易添加),需要加以利用。

于 2012-10-16T01:15:59.843 回答
1

如上建议使用 ":animated" 选择器

if(msg.d == "true") {
    var contact = $("#addContactEmailError");

    if(!contact.is(":visible") && !contact.is(":animated")) {
         contact.show('bounce');
    }
    $("#addContactSubmitButton").attr("disabled", true);
}
else {
    if(contact.is(":visible") && !contact.is(":animated")) {
         contact.hide('slide', { direction: "up" });
    }
    $("#addContactSubmitButton").attr("disabled", false);
}
于 2012-09-21T16:52:16.930 回答
1

也许你应该使用.stop().hide(and ,.stop.show(无论你在哪里使用hideand show

于 2012-09-21T17:02:20.327 回答
1

您可以使用动画选择器检查它当前是否正在动画。

http://api.jquery.com/animated-selector/

于 2012-09-21T16:40:06.987 回答