【问题标题】:jQuery how to loop a function after a series of delayjQuery如何在一系列延迟后循环一个函数
【发布时间】:2023-04-03 01:13:01
【问题描述】:

我有一个具有一系列延迟函数的函数:

function greet(t) {
    $("div").delay(t*2).queue(function(n) {
         $(this).html("Bonjour");
        n();
    });

    $("div").delay(t*3).queue(function(n) {
         $(this).html("Hola");
        n();
    });

    $("div").delay(t*4).queue(function(n) {
         $(this).html("Hallo");
        n();
    });

    $("div").delay(t*5).queue(function(n) {
        $(this).html("Hello"); // back to original
        n();
    });
}

greet(500);

在 HTML 中使用简单的<div>Hello</div>。这样,问候语每 500 毫秒更改一次语言。

函数完成后(大约需要 2 秒;2000 毫秒)我想重新启动函数并无限循环它。所以,我尝试了通常的方法:

    setTimeout(function() {
       greet(500);
    }, 2500); // after 2500ms, repeat the function

如果您注意到,一旦它循环了两次,它就会在“Hello”处停止。为什么是这样?这是一个显示我的问题的小提琴http://jsfiddle.net/rgX6B/2/

任何帮助将不胜感激!

编辑:

我实际上是为了提出问题而简化了我的问题。我不想贴一大堵代码(内部html的更改实际上是涉及更改CSS形状位置的复杂功能。)我的问题最终通过将setTimeout inside em>函数。谢谢大家的回答!

【问题讨论】:

  • 您的问候语不会每 500 毫秒更改一次。第一个是 1000ms 之后,第二个是 1500ms 之后,下一个是 2000ms 之后,以此类推。您正在使用.queue(),但也增加了两者之间的持续时间。如果你想要每 500 毫秒,那就去掉乘法。
  • ...为了解决您的问题,您根本不需要setTimeout()。只需将greet(500) 放在n(); 之后的最后一个回调中即可。 jsfiddle.net/rgX6B/6

标签: javascript jquery html loops delay


【解决方案1】:

你只需要在你的函数中使用它

http://jsfiddle.net/kelunik/rgX6B/4/

function greet(t) {
    $("div").delay(t*1).queue(function(n) {
         $(this).html("Bonjour");
        n();
    });

    $("div").delay(t*2).queue(function(n) {
         $(this).html("Hola");
        n();
    });

    $("div").delay(t*3).queue(function(n) {
         $(this).html("Hallo");
        n();
    });

    $("div").delay(t*4).queue(function(n) {
        $(this).html("Hello"); // back to original
        n();
    });

    setTimeout(function() {
       greet(500);
    }, 500);
}

greet(500);

另一种解决方案是使用setInterval(function() { greet(..) }, 3000);

【讨论】:

    【解决方案2】:

    您的算法看起来有点乱,并且违反了 DRY,使其更难维护。这是另一种选择:

    http://jsfiddle.net/LLQXj/

    var greetings = [
        "Hello",
        "Bonjour",
        "Hola",
        "Hallo"
    ];
    
    function greet(idx) {
        $('div').html(greetings[idx]);
        var next = (idx + 1) > (greetings.length - 1) ? 0 : idx + 1;
        setTimeout(function() { greet(next); }, 1000);
    }
    
    greet(0);
    

    【讨论】:

    • 我会使用它,但实际上我为了提出问题而简化了我真正拥有的东西。我知道当人们发布大量代码时,它会阻止回答者回答。我无法适应我真正拥有的东西。不过感谢您的回答!
    【解决方案3】:

    “如果你注意到,一旦它循环了两次,它就会停在“Hello”处。这是为什么?”

    setTimeout() 方法在给定延迟后将要执行的函数排队一次,因此如果您希望它继续重复,则需要从函数内部调用它 - 或使用 @改为 987654324@。

    但是,您误用了.delay() 方法,该方法实际上是打算与other jQuery animation methods 一起使用的。 setTimeout() 是你应该使用的函数中的所有延迟。我可能会更像这样实现您的功能:

    function greet(delay, messages, nextMessage) {
        if (nextMessage === undefined) nextMessage = 0;
        $("div").html(messages[nextMessage]);
        setTimeout(function() {
            greet(delay, messages, (nextMessage + 1) % messages.length);
        }, delay);
    }
    
    greet(500, ["Hello","Hola","Hallo"]);
    

    演示:http://jsfiddle.net/rgX6B/5/

    您也许可以添加另一个参数来指示要为哪些元素设置.html(),而不是在函数中硬编码...

    【讨论】:

    • 我会使用它,但实际上我为了提出问题而简化了我真正拥有的东西。我知道当人们发布大量代码时,它会阻止回答者回答。我无法适应我真正拥有的东西。不过感谢您的回答!
    猜你喜欢
    • 2012-11-19
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多