【问题标题】:javascript + jquery + setinterval + animationjavascript + jquery + setinterval + 动画
【发布时间】:2012-05-20 06:29:33
【问题描述】:

我遇到了 setInterval 和 jquery animate 的问题。这是我的代码:

function slides1() {

    ...

    $("table#agah1").animate({
        "left": first1
    }, "slow");
    $("table#agah2").animate({
        "left": first2
    }, "slow");
}

$(function () {
    cyc = setInterval("slides1()", 3000);
});

当切换到另一个浏览器选项卡,并在一段时间后返回时,动画会毫不延迟地继续执行,直到我离开该选项卡的时间,然后才能正确操作。我也添加了这些,但没有任何运气:

$(window).focus(function () {
    jQuery.fx.off = false;
    cyc = setInterval("slides1()", 3000);
});
$(window).blur(function () {
    jQuery.fx.off = true;
    window.clearInterval(cyc);
});

【问题讨论】:

  • 这里不是问题,而是传递函数引用,不要传递字符串。

标签: javascript jquery jquery-animate setinterval


【解决方案1】:

较新版本的 jQuery 使用 requestAnimationFrame 回调来处理效果,而浏览器不会处理隐藏选项卡上的效果。

与此同时,您的 setInterval 事件仍在发生,导致更多动画排队。

与其使用setInterval 来安排动画,不如使用上一个动画的“完成回调”来触发下一个循环,必要时使用setTimeout

function slides1() {

    ...

    $("table#agah1").animate({
        "left": first1
    }, "slow");
    $("table#agah2").animate({
        "left": first2
    }, "slow", function() {
       setTimeout(slides1, 2000); // start again 2s after this finishes
    });
}

$(function () {
    setTimeout(slides1, 3000);    // nb: not "slides1()"
});

这将确保动画间延迟和动画本身之间存在紧密耦合,并避免setTimeout 与动画不同步的任何问题。

【讨论】:

  • requestAnimationFrame 不是一个选项。它有很多错误,但在跨浏览器中仍然无法像魅力一样工作:bugs.jquery.com/ticket/9381
  • @HabibS 啊 - 我没有发现他们已经恢复了。无论如何,上面的代码更可取 - 它将动画和超时结合在一起,以防止您看到的问题。
  • @HabibS 无论如何,你的问题都不清楚。您想要在切换标签时从头开始动画吗?
  • 您的第二个建议确实有效。问题是如果发生页面模糊,所有 jquery 动画/淡入淡出/...命令 + setinterval 将被暂停,并且在页面焦点后将立即执行所有循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多