第一次倒计时后未显示 HTML 中的计时器

波特曼

已经在这个版本的 whack-a-mole 上工作了一段时间。当前版本在这里和代码如下。

问题在于靠近底部的 startGame() 函数。当我每次按下按钮时,它都会正确地从 10 倒计时,当我 console.log 计时器时,它在某种意义上起作用。但是,在第一次之后,它会尝试说“超时”和当前计时器编号以及相同的时间。

我错过了什么?

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Whack A Mole!</title>
  <link href='https://fonts.googleapis.com/css?family=Amatic+SC:400,700' rel='stylesheet' type='text/css'>

</head>

<body>

  <h1>Whack-a-mole! <span class="score">0</span></h1>
  <button class=button onClick="startGame()">Start!</button>

  <div class="game">
    <div class="hole hole1">
      <div class="mole"></div>
    </div>
    <div class="hole hole2">
      <div class="mole"></div>
    </div>
    <div class="hole hole3">
      <div class="mole"></div>
    </div>
    <div class="hole hole4">
      <div class="mole"></div>
    </div>
    <div class="hole hole5">
      <div class="mole"></div>
    </div>
    <div class="hole hole6">
      <div class="mole"></div>
    </div>
  </div>

  <h2 class="timer"> Countdown: <span id="countDown"> 10</span></h2>

  <script>
    const holes = document.querySelectorAll('.hole');
    const scoreBoard = document.querySelector('.score');
    const moles = document.querySelectorAll('.mole');
    const countDown = document.getElementById('countDown');
    let lastHole;
    let score = 0;


    function randomTime(min, max) {
      return Math.round(Math.random() * (max - min) + min);
    }

    function randomHole(holes) {
      const idx = Math.floor(Math.random() * holes.length);
      const hole = holes[idx];
      if (hole === lastHole) {
        return randomHole(holes);
      }
      lastHole = hole
      return hole;
    }

    function peep() {
      const time = randomTime(200, 1000);
      const hole = randomHole(holes);
      hole.classList.add('up');
      setTimeout(() => {
        hole.classList.remove('up');
        if (!timeUp) peep();

      }, time);
    }

    function startGame() {
      scoreBoard.innerHTML = 0;
      timeUp = false;
      score = 0;
      let timer = 10;
      peep();
      setTimeout(() => timeUp = true, 10000)

      var timeOut = setInterval(function () {
        timer--;
        if (timer > 0) {
          countDown.classList.remove('timeUp')
          countDown.innerHTML = timer;
        } else {
          countDown.innerHTML = "Times up!";
          countDown.classList.add('timeUp');
          return;
        }
        console.log(timer);
      }, 1000);
    }

    function bonk(e) {
      if (!e.isTrusted) return; //cheater without clicking
      score++;
      this.classList.remove('up');
      scoreBoard.textContent = score;
    }

    moles.forEach(mole => mole.addEventListener('click', bonk));
  </script>
</body>

</html>

泰勒·罗珀

每次调用时,startGame()您都在创建另一个间隔,但您永远不会删除前一个。您最终会同时运行多个时间间隔 - 他们的一些计时器是完整的,而最近的则没有,因此它们最终会发生冲突并来回更改文本。

只需将您的替换returnclearInterval(timeOut)

var timeOut = setInterval(function () {
  timer--;
  if (timer > 0) {
    countDown.classList.remove('timeUp')
    countDown.innerHTML = timer;
  } else {
    countDown.innerHTML = "Times up!";
    countDown.classList.add('timeUp');
    clearInterval(timeOut);
  }
  console.log(timer);
, 1000);

完整代码:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Whack A Mole!</title>
  <link href='https://fonts.googleapis.com/css?family=Amatic+SC:400,700' rel='stylesheet' type='text/css'>

</head>

<body>

  <h1>Whack-a-mole! <span class="score">0</span></h1>
  <button class=button onClick="startGame()">Start!</button>

  <div class="game">
    <div class="hole hole1">
      <div class="mole"></div>
    </div>
    <div class="hole hole2">
      <div class="mole"></div>
    </div>
    <div class="hole hole3">
      <div class="mole"></div>
    </div>
    <div class="hole hole4">
      <div class="mole"></div>
    </div>
    <div class="hole hole5">
      <div class="mole"></div>
    </div>
    <div class="hole hole6">
      <div class="mole"></div>
    </div>
  </div>

  <h2 class="timer"> Countdown: <span id="countDown"> 10</span></h2>

  <script>
    const holes = document.querySelectorAll('.hole');
    const scoreBoard = document.querySelector('.score');
    const moles = document.querySelectorAll('.mole');
    const countDown = document.getElementById('countDown');
    let lastHole;
    let score = 0;


    function randomTime(min, max) {
      return Math.round(Math.random() * (max - min) + min);
    }

    function randomHole(holes) {
      const idx = Math.floor(Math.random() * holes.length);
      const hole = holes[idx];
      if (hole === lastHole) {
        return randomHole(holes);
      }
      lastHole = hole
      return hole;
    }

    function peep() {
      const time = randomTime(200, 1000);
      const hole = randomHole(holes);
      hole.classList.add('up');
      setTimeout(() => {
        hole.classList.remove('up');
        if (!timeUp) peep();

      }, time);
    }

    function startGame() {
      scoreBoard.innerHTML = 0;
      timeUp = false;
      score = 0;
      let timer = 10;
      peep();
      setTimeout(() => timeUp = true, 10000)

      var timeOut = setInterval(function() {
        timer--;
        if (timer > 0) {
          countDown.classList.remove('timeUp')
          countDown.innerHTML = timer;
        } else {
          countDown.innerHTML = "Times up!";
          countDown.classList.add('timeUp');
          clearInterval(timeOut);
        }
        console.log(timer);
      }, 1000);
    }

    function bonk(e) {
      if (!e.isTrusted) return; //cheater without clicking
      score++;
      this.classList.remove('up');
      scoreBoard.textContent = score;
    }

    moles.forEach(mole => mole.addEventListener('click', bonk));
  </script>
</body>

</html>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

第二次倒计时后重置第一次倒计时

来自分类Dev

使用计时器循环遍历HTML中的图像

来自分类Dev

Java程序中的计时器,倒计时

来自分类Dev

计时器(倒计时)

来自分类Dev

新年计时器内部HTML

来自分类Dev

计时器上的变色文字?(HTML)

来自分类Dev

HTML:页面每5秒载入一次,并显示倒计时(例如5,4,3,2,1),然后重新载入页面

来自分类Dev

计时器未正确倒计时

来自分类Dev

在第一次“勾选”之前设置进度条(倒计时)的宽度(没有额外的库)

来自分类Dev

第一次迭代完成后更改计时器间隔

来自分类Dev

jQuery中的计时器

来自分类Dev

Python中的计时器

来自分类Dev

ForkJoin中的计时器

来自分类Dev

Python中的计时器

来自分类Dev

Python中的计时器

来自分类Dev

JavaScript 中的计时器

来自分类Dev

在单个计时器中处理多计时器

来自分类Dev

计时器中的 Swift 3 计时器

来自分类Dev

计时器倒计时中未显示的所有数字

来自分类Dev

倒计时到计时器计时

来自分类Dev

倒计时计时器开始计时

来自分类Dev

HTML 中的 JS 倒计时

来自分类Dev

在Java框架中显示计时器

来自分类Dev

在Blazor中显示计时器

来自分类Dev

在应用中显示计时器?

来自分类Dev

倒计时/计时器,以更改kivy / python中的屏幕

来自分类Dev

在ReactJs中制作计时器/倒计时代码时遇到问题

来自分类Dev

倒计时计时器中的JavaScript重定向循环

来自分类Dev

如何在ASP.NET MVC中添加计时器倒计时操作