【问题标题】:Repeat a function forever [duplicate]永远重复一个功能[重复]
【发布时间】:2013-09-12 06:19:27
【问题描述】:

下面我调用一个函数。该函数等待,然后淡出图像,等待,然后将其淡入。

function fadeOut() {
  $('img.my-image').delay(5000).fadeOut(500, function() {
    $('img.my-image').delay(5000).fadeIn(500);
  });
}
fadeOut();

我怎样才能让这个功能永远重复?我可以在 fadeOut 函数的结束 } 之前放置一行代码,使其重新从头开始吗?

更新 - 这是我的 Drupal 站点。看来代码应该可以工作。 http://smartpeopletalkfast.co.uk/t/

这是我的确切代码:

$(document).ready(function() {
  if ( $(window).width() > 960) {
    function fadeOutFunc() {
      $('.image-list .bottom').delay(1000).fadeOut(500, function() {
        $('.image-list .bottom').delay(1000).fadeIn(500,fadeOutFunc);
      });
    }

    fadeOutFunc();
    // jQuery('.image-list .bottom').css('opacity','0.6');
  }    
});

【问题讨论】:

  • 可能使用setInterval

标签: jquery


【解决方案1】:

是的,只需告诉它在fadeIn 结束时调用自己。幸运的是,jQuery 内置了对此的支持,您已经在使用它来在淡出后淡入:

function fadeOut() {
    $('img.my-image').delay(5000).fadeOut(500, function() {
        $('img.my-image').delay(5000).fadeIn(500,fadeOut); // <-- see the tiny change?
    });
}

fadeOut();

编辑:在我看来,您可以使用更多 jQuery 的语法来稍微简化一下:

function fadeOut() {
    $('img.my-image').delay(5000).fadeOut(500).delay(5000).fadeIn(500,fadeOut);
}
fadeOut();

【讨论】:

  • @Blender 他为什么要这么做?每次同步块完成时堆栈都会展开 - 剩下的是一堆未决的超时。
  • @Blender 你确定吗?这没有嵌套范围,所以它不应该...... jQuery 的回调必须是低级别的事件驱动,所以这应该没问题。
  • @JanDvorak:是的,它在 900 次迭代时就死了。通过删除 .delay() 调用并将动画速度设置为 0 来尝试一下。
  • @Blender 通过这样做,您已经完全从循环中删除了事件,所以在这种情况下,是的,它会死掉(jQuery 将采用快捷方式并在同一范围内执行回调)
  • 是否有理由不使用 setInterval - 它似乎正是它的用途。不质疑只是好奇。
【解决方案2】:

如果是我,我会使用 setInterval:

setInterval(function fadeOut() {
    $('img.my-image').delay(5000).fadeOut(500, function() {
        $('img.my-image').delay(5000).fadeIn(500);
    });
}, 1000);

这将每 1 秒加载一次函数,因为 1000 毫秒是 1 秒。而且它不会停止!

编辑:您可以在工作中使用任意多的秒数。只需将它们用作 second_count * 1000 作为 2*1000 或 2000 2 秒。

这不是 Jan Dovark 的问题,您可以尝试使用以下代码:

$(window).focus(function() {

所以 setInterval 在窗口选项卡处于焦点时起作用!

【讨论】:

  • 这可能是更整洁的解决方案,但您需要使用 11000 而不是 1000 的间隔。出于类似的原因,它可能更难维护。不知道为什么你被否决了。
  • 如果一切顺利,您正在排队的动画需要 11 秒,因此您不应该每秒或每两秒钟排队一次。即使你每 11 秒排队一次,如果浏览器打嗝并花时间调用一个重要的超时,东西就会开始排队 - 可能没什么严重的,但仍然不干净。
  • 否决,因为它是一个脆弱的解决方案。如果间隔比动画短,jQuery 动画队列将开始增长。如果间隔较长,则可能很难调试暂停的原因。每次更改函数内部的时间时,都必须将更改传播到间隔。很容易忘记。
  • @Dave 即使您正确设置了时间,如果出现延迟(它会),jQuery 队列也会建立起来。想象一下将水倒入漏斗中。与漏斗最大值相比,吞吐量会降低,或者漏斗会溢出。更好的解决方案:每次空漏斗时向漏斗中倒入一些水 - 您将最大限度地提高吞吐量并且漏斗不会溢出。
  • 使用这个可以最小化问题兄弟$(window).focus(function() {所以这个函数只在窗口处于焦点时运行。
猜你喜欢
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
  • 2012-10-19
  • 1970-01-01
相关资源
最近更新 更多