javascript - setInterval() 添加类然后删除类相同的时间

标签 javascript jquery recursion settimeout intervals

我正在尝试制作一个简单的“西蒙游戏”。我目前无法尝试将类“打开”添加到 div 一秒钟,然后在相同的时间内删除该类。

所以我有四个 div,它们根据数字序列闪烁,例如[0, 1, 2, 3]。这将使 div[0] 闪烁一秒钟,然后关闭一秒钟,然后移动到 div[1],然后打开和关闭等等。

这是我的功能

/**
 * sequence => array [0, 1, 2, 3]
 * speed    => int 1000 (one second)
 */
playSequence: function(sequence, speed){
    var self = this;

    // removes class 'on'
    view.turnOffPads();
    setTimeout(function(){
        // adds the 'on' class to a specific div
        view.lightUpPad(model.startupSequence[model.count]);
    }, speed / 2);

    setTimeout(function(){
        model.count++; // keeps track of the iterations
        if (model.count < sequence.length) { // if we are still iterating
            self.playSequence(sequence, speed); // light up the next div
        } else {
            model.count = 0; // set back to zero
        }
    }, speed);
},

问题是我同时使用了两个 setTimeout 函数,虽然它有效,但我想知道是否有更好的方法。如果您看的话,我在我的模型对象中使用了一个计数变量来跟踪迭代。

到目前为止,这是我的完整 javascript 应用程序...

$(function(){

    var model = {
        on: false,
        strictMode: false,
        startupSequence: [0, 1, 2, 3, 3, 3, 2, 1, 0, 3, 2, 1, 0, 2, 1, 3],
        score: 0,
        sequence: [],
        count: 0,
    }

    var controller = {
        init: function(){
            view.cacheDOM();
            view.bindEvents();
        },
        getSequence: function(){
            // get a random number from one to 4
            var random = Math.floor(Math.random() * 4);
            // push it to the sequence array
            model.sequence.push(random);
            console.log(model.sequence);
            // play it
            this.playSequence(model.sequence);
        },

        /**
         * sequence => array [0, 1, 2, 3]
         * speed    => int 1000 (one second)
         */
        playSequence: function(sequence, speed){
            console.log(sequence.length);
            var self = this;

            view.turnOffPads();
            setTimeout(function(){
                view.lightUpPad(model.startupSequence[model.count]);
            }, speed / 2);

            setTimeout(function(){
                model.count++;
                if (model.count < sequence.length) {
                    self.playSequence(sequence, speed);
                } else {
                    model.count = 0;
                }
            }, speed);
            // view.turnOffPads();
        },
    }

    var view = {
        cacheDOM: function(){
            this.$round  = $('#round');
            this.$start  = $('#start');
            this.$strict = $('#strict');
            this.$pad    = $('.pad');

            this.$padArray = document.getElementsByClassName('pad');
        },
        bindEvents: function(){
            this.$start .change(this.start.bind(this));
            this.$strict.change(this.setStrictMode.bind(this));
        },
        start: function(){
            // turn on pads
            if (model.on) {
                this.$pad.removeClass('on');
                this.$round.text('--');
                model.on = false;
                // reset everything
            } else {
                this.$round.text(model.score);
                model.on = true;
                controller.playSequence(model.startupSequence, 100)
                // controller.getSequence();
            }
        },
        lightUpPad: function(i){
            $(this.$padArray[i]).addClass('on');
        },
        turnOffPads: function(){
            this.$pad.removeClass('on');
        },
        setStrictMode: function(){
            if (model.strictMode) {
                model.strictMode = false;
            } else {
                model.strictMode = true;
            }
        }
    }

    controller.init();
});

有没有更简洁的方法来添加类,然后删除类?

最佳答案

使用 setInterval 而不是 setTimeout 我创建了四个分区并使每个分区闪烁 1 秒。

var i = 0,
    j = 4;

function blink(i) {
  new Promise(function(resolve, reject) {
  x = setTimeout(function() {
    document.querySelectorAll(".post-text")[i].classList.add("myClass");
    resolve("added");
  }, 1000)
  }).then(function(a) {
  new Promise(function(res, rej) {
    setTimeout(function() {
      clearInterval(x);
      document.querySelectorAll(".post-text")[i].classList.remove("myClass");
      res("deleted");
    }, 1000)
  }).then(function(a) {
    i++;
    if (i < j) {
      blink(i);
    } else {
      i = 0;
      blink(i);
    }
  });

  });
}
blink(i);
.myClass {
  background-color:yellow;
}
<div class="post-text">A</div>
<div class="post-text">B</div>
<div class="post-text">C</div>
<div class="post-text">D</div>

关于javascript - setInterval() 添加类然后删除类相同的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46182318/

相关文章:

ruby - 汉诺塔 : Recursive Explanation in Ruby

javascript - 如何从 ASP.NET MVC 4 Controller 捕获 JSON 结果?

javascript - 从 Highcharts 获取图像 PHP Laravel

javascript - 如果 SQL 中有数据则显示一个按钮,否则隐藏

javascript - 通过以下 HTML lang 值更改内部 HTML

java - 从 JavaScript 向 Java 发送 JSON 时出错

ruby-on-rails - Ruby on Rails 上的递归树

java - 如何仅使用堆栈实现递归函数?

Javascript - 粘性按钮取决于标题宽度

javascript - 对于每个较小或较大浏览器的像素,从 divs 右侧元素添加/删除 1px