【问题标题】:javascript cycle tags with delay带有延迟的javascript循环标签
【发布时间】:2018-07-24 17:29:03
【问题描述】:

我正在使用 javascript 在 4 个标签 (p1,p2,p3,p4) 和另一个随每个 p 更新的标签 (deck) 之间循环。 缺少的部分是我无法在可以识别的地方放置延迟。

<script type="text/javascript">
    var players = $('p[id^="p"]');
    i=0;
    (function cycle() {

        players.eq(i).load('game.php?p='+i, cycle);
        $('#deck').load('game.php?deck=1');
        i = ++i % players.length;

    })();
</script>

我试过了

        players.eq(i).load('game.php?p='+i, cycle).delay(1000);

但是延迟方法完全被忽略了。我应该在哪里延迟让它工作?

【问题讨论】:

  • 在获取当前元素的数据后,您是否想在 1 秒内调用 cycle()?或者这个1s你只需要在新循环之前执行以下几行代码?

标签: javascript delay cycle


【解决方案1】:

delay 方法将空白回调添加到效果队列。队列依次执行每个回调。因此,要将延迟应用于函数,您必须通过.queue() 将该函数排入效果队列,并通过运行.dequeue() 告诉队列该函数何时完成。

根据您的问题,我不能 100% 确定您希望延迟在哪里,但如果加载 p,等待完成,加载甲板,等待完成,延迟 1 秒,然后移至下一项:

    var players = $('p[id^="p"]');
    i=0;
    /*
     * cycle through the players.
     */
    (function cycle() {
        // first load ?p. Dequeue once finished loading
        $.queue(function() {
            players.eq(i).load('game.php?p='+i, $.dequeue);
        })
        // Next load deck=1. Dequeue once finished loading
        $.queue(function() {
            $('#deck').load('game.php?deck=1', function() {
                // increment/loop once loading is complete
                i = ++i % players.length;
                $.dequeue();
            })
        })
        $.delay(1000)
        $.queue(function() {
            cycle();
        })
    }());

尚未测试代码,但应该会给您正确的想法。我们正在排队几个函数,最后一个在它之前有一个延迟。 jQuery 将运行第一个并等到 $.dequeue 被调用后再运行下一个,等等。

$.delay() 基本上只是$.queue(function() {setTimeout($.dequeue, time)}) 的别名。例如:它一直等到 setTimeout 完成,然后才将自己出队并允许队列中的下一个函数运行。

【讨论】:

  • 好的,我掌握了队列概念的逻辑,但是如果我使用这段代码,我会收到一个错误,其中“TypeError: $.queue(...).queue is not a function”,我不知道怎么解决
  • 因为它是 jQuery 类的“静态”方法,它可能不支持链接。我已经调整了代码以反映这一点。您还可以将播放器用作支持链接的 jquery 对象进行排队/出队。例如,players.eq(i).queue(...)
【解决方案2】:

我能够让它重新思考它。我还添加了一个按钮来停止它和一个按钮来重置整个循环(前端和后端)。 我不得不手动构建数组,因为元素不是我需要的顺序。

这是工作代码:

<script type="text/javascript">
    var players = [];
    players.push($('#p0'));
    players.push($('#p1'));
    players.push($('#p2'));
    players.push($('#p3'));
    i=0;
    /*
     * cycle through the players.
     */
    function cyclePlayer() {

        players[i].load('game.php?p='+i);
        $('#deck').load('game.php?deck=1');
        console.log(i);
        console.log(players[i]);
        i = ++i % players.length;
    }
    PlayerLoop = setInterval('cyclePlayer()', 1500 );

    $("#stop").click(function(){
        console.log('stop game');
        clearInterval(PlayerLoop);
    });

    $('#reset').click(function() {
        $('#deck').load('game.php?reset=1');
        location.reload();
    });
</script>

【讨论】:

  • 这绝对是比您的原始代码更好的方法,我几乎进入了但想回答为什么延迟被忽略的问题。不错的重构!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多