【问题标题】:can't resume the timer javascript无法恢复计时器javascript
【发布时间】:2021-11-24 05:49:25
【问题描述】:

这里的新手网络开发人员,我目前正在创建一个记忆游戏,其中找到一对卡片,该卡片的图像将显示在弹出窗口中。不幸的是,我遇到了这个问题,当我翻转一对卡片时,它会停止计时器并在弹出窗口中显示卡片的图像,但是当我恢复游戏时,计时器仍然停止。这是我的代码:

const cards = document.querySelectorAll('.memory-card');

let hasFlippedCard = false;
let lockBoard = false;
let firstCard, secondCard;
let matchCounter=0;
let timerCtrl = null; // store the return value of setInterval

function flipCard() {
  if (lockBoard) return;
  if (this === firstCard) return;

  this.classList.add('flip');

  if (!hasFlippedCard) {
    hasFlippedCard = true;
    firstCard = this;

    return;
  }

  secondCard = this;
  checkForMatch();
}

function checkForMatch() {
  let isMatch = firstCard.dataset.framework === secondCard.dataset.framework;
  if(isMatch){
      matchCounter+=1;
      disableCards();
      Swal.fire({
        html:
          '<a href="//sweetalert2.github.io">links</a> ',
        imageUrl: 'https://unsplash.it/400/200',
        imageWidth:150,
        imageHeight: 150,
        imageAlt: 'Custom image',
        confirmButtonText: 'Resume Game',
        allowOutsideClick: false
        
      })

        clearInterval(timerCtrl); 
          if(matchCounter==(cards.length/2)){
            Swal.fire({
              title: 'Congratualtions!!!',
              text: 'You finish the game '+ counterVal +' Moves. Thank you for playing',
              allowOutsideClick: false
            })
            setTimeout(timerCtrl, 1000); // it will stop the timer
            }
        }
          else{ unflipCards(); }

  
}

function disableCards() {
  firstCard.removeEventListener('click', flipCard);
  secondCard.removeEventListener('click', flipCard);

  resetBoard();
}

function unflipCards() {
  lockBoard = true;

  setTimeout(() => {
    firstCard.classList.remove('flip');
    secondCard.classList.remove('flip');

    resetBoard();
  }, 500);
}

function resetBoard() {
  hasFlippedCard = false;
  lockBoard = false;
  firstCard = null;
  secondCard = null;
 
  
}

(function shuffle() {
  cards.forEach(card => {
    let randomPos = Math.floor(Math.random() * 12);
    card.style.order = randomPos;
  });
})();

cards.forEach(card => card.addEventListener('click', flipCard));

function restartButton(){
  location.reload();
}
var i = 0;
function timer(id){
if(id == '1'){
  i++;
  if(i === 1){
    time();
  }
}else if(id=='2'){
  //dri nimo e butang ang pause nga function
}else if(id == '3'){
  //function for continue time
}
}

var numr = 0;
function countClick(){
  numr ++;
  console.log(numr);
}

/*Timer*/
 
function time(){
 
  // var target = document.getElementsById("back");
  // target.removeAttribute("onclick");
  var minutesLabel = document.getElementById("minutes");
  var secondsLabel = document.getElementById("seconds");
  var totalSeconds = 0;
  timerCtrl = setInterval(setTime, 1000);
  
  function setTime() {
    ++totalSeconds;
    secondsLabel.innerHTML = pad(totalSeconds % 60);
    minutesLabel.innerHTML = pad(parseInt(totalSeconds / 60));
  }
  
  function pad(val) {
    var valString = val + "";
    if (valString.length < 2) {
      return "0" + valString;
    } else {
      return valString;
    }
  }
}

var counterVal = 0;

function incrementClick(){
  updateDisplay(++counterVal);
}
function resetCounter(){
  counterVal = 0;
  updateDisplay(counterVal);
}
function updateDisplay(val){
  document.getElementById("counter-label").innerHTML = val;
}
* {
  margin: 0;
  box-sizing: border-box;
}

body {
  background: url('https://github.com/FoxyStoat/memory-game/blob/master/assets/img/ignasi_pattern_s.png?raw=true');
  ;
}
h1{
  font-weight: 400;
  text-shadow: 1px 1px 2px rgba(80, 80, 80, 0.6);
}

.container{
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
}

.memory-game {
  width: 340px;
  height: 340px;
  display: flex;
  flex-wrap: wrap;
  perspective: 100%;
  margin:5px;
}

.memory-card {
  width: calc(25% - 10px);
  height: calc(33.333% - 10px);
  margin:5px;
  /* position: relative; */
  /* transform: scale(1); */
  transform-style: preserve-3d;
  transition: transform .5s;
  box-shadow: 1px 1px 1px rgba(0,0,0,.3);
}

.memory-card:active {
  transform: scale(0.97);
  transition: transform .2s;
}

.memory-card.flip {
  transform: rotateY(180deg);
}

.front-face,
.back-face {
  width: 100%;
  height: 100%;
  /* padding: 1px; */
  position: absolute;
  /* border-radius: 5px; */
  /* background: #1C7CCC; */
  backface-visibility: hidden;
}

.front-face {
  transform: rotateY(180deg);
}

.score-panel {
  text-align: left;
  width: 270px;
  margin-bottom: 10px;
  color: #0d0d0e;
}

.score-panel .stars {
  margin: 0;
  padding: 0;
  display: inline-block;
  margin: 0 5px 0 0;
  color: rgb(24, 23, 23);
}

.score-panel .stars li {
  list-style: none;
  display: inline-block;
}

.score-panel .timer {
  display: inline;
  position: absolute;
  left: 50%;
}

.score-panel .restart {
  float: right;
  cursor: pointer;
}


@media only screen  and (min-device-width: 768px)
  and (max-device-width: 1024px){
     .memory-game{
      width: 860px;
      min-height: 880px;


    }
}
@media only screen
  and (min-device-width: 375px)
  and (max-device-width: 812px) {
    .memory-game{
      width: 860px;
      min-height: 880px;


    }
  }

@media only screen
  and (min-device-width: 320px)
  and (max-device-width: 568px) {
    .memory-game{
      width: 860px;
      min-height: 880px;


    }
  }

  .swal-wide{
    width:850px !important;
}
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">

<title>Memory Game</title>
<link rel = "stylesheet" href ="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<link rel="stylesheet prefetch" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.1/css/font-awesome.min.css">
<link rel="stylesheet prefetch" href="https://fonts.googleapis.com/css?family=Coda">
<link rel="stylesheet prefetch" href="https://fonts.googleapis.com/css?family=Coda">
<link rel="stylesheet prefetch" href="https://fonts.googleapis.com/css?family=Gloria+Hallelujah|Permanent+Marker" >
<link href="<?php echo base_url();?>resources/dist/css/style.css" rel="stylesheet">
</head>
<body>
<div class = "container">
  <h1>Memory Game</h1>
  <section class="score-panel">
            <!-- <ul class="stars">
                <li><i class="fa fa-star"></i></li>
                <li><i class="fa fa-star"></i></li>
                <li><i class="fa fa-star"></i></li>
            </ul> -->

            <span>Moves <span id = "counter-label">0</span></span>

            <div class="timer">
                <label id="minutes">00</label>:<label id="seconds">00</label>
            </div>

            <div class="restart">
                <button onclick="restartButton()" class="fa fa-repeat"></button>
            <!-- <div class="col text-center">
                <button button type = "button" class = "btn btn-danger">Reset</button>
            </div> -->
            </div>
        </section>
        <?php include("header.php")?>

  <div class="memory-game ">
    <div class="memory-card" data-framework="aurelia">
      <img class="front-face" src="<?php echo base_url();?>/resources/dist/img/fb.png" class = "img-fluid"alt="fb" />
      <img onclick = "incrementClick(); timer('1');" id="back" class="back-face" src="<?php echo base_url();?>/resources/dist/img/card.png" class = "img-fluid"alt="yugioh" />
    </div>

    <div class="memory-card" data-framework="aurelia">
      <img class="front-face" src="<?php echo base_url();?>/resources/dist/img/fb.png" class = "img-fluid"alt="fb" />
      <img onclick = "incrementClick(); timer('1');" id = "back" class="back-face" src="<?php echo base_url();?>/resources/dist/img/card.png" class = "img-fluid"alt="yugioh" />
    </div>

    <div class="memory-card" data-framework="vue">
      <img class="front-face" src="<?php echo base_url();?>/resources/dist/img/js.jpg" class = "img-fluid"alt="js" />
      <img onclick = "incrementClick(); timer('1');" id = "back"id="back" class="back-face" src="<?php echo base_url();?>/resources/dist/img/card.png" class = "img-fluid"alt="yugioh" />
    </div>
              
    <div class="memory-card" data-framework="vue">
      <img class="front-face" src="<?php echo base_url();?>/resources/dist/img/js.jpg" class = "img-fluid"alt="js" />
      <img onclick = "incrementClick(); timer('1');" id="back" class="back-face" src="<?php echo base_url();?>/resources/dist/img/card.png" class = "img-fluid"alt="yugioh" />
    </div>

    <!-- <div class="memory-card" data-framework="angular">
      <img class="front-face" src="<?php echo base_url();?>/resources/dist/img/pikachu.jpg" class = "img-fluid"alt="pika" />
      <img onclick = "incrementClick(); timer('1');" id="back" class="back-face" src="<?php echo base_url();?>/resources/dist/img/card.png" class = "img-fluid"alt="yugioh" />
    </div>

    <div class="memory-card" data-framework="angular">
      <img class="front-face" src="<?php echo base_url();?>/resources/dist/img/pikachu.jpg" class = "img-fluid"alt="pika" />
      <img onclick = "incrementClick(); timer('1');" id="back" class="back-face" src="<?php echo base_url();?>/resources/dist/img/card.png" class = "img-fluid"alt="yugioh" />
    </div>

    <div class="memory-card" data-framework="ember">
      <img class="front-face" src="<?php echo base_url();?>/resources/dist/img/spider.png" class = "img-fluid"alt="spider" />
      <img onclick = "incrementClick(); timer('1');" class="back-face"  src="<?php echo base_url();?>/resources/dist/img/card.png" class = "img-fluid"alt="yugioh" />
    </div>

    <div class="memory-card" data-framework="ember">
      <img class="front-face" src="<?php echo base_url();?>/resources/dist/img/spider.png" class = "img-fluid"alt="spider" />
      <img onclick = "incrementClick(); timer('1');" id="back" class="back-face" src="<?php echo base_url();?>/resources/dist/img/card.png" class = "img-fluid"alt="yugioh" />
    </div>

    <div class="memory-card" data-framework="backbone">
      <img class="front-face" src="<?php echo base_url();?>/resources/dist/img/lion.jpg" class = "img-fluid"alt="lotus" />
      <img onclick = "incrementClick(); timer('1');"id="back" class="back-face" src="<?php echo base_url();?>/resources/dist/img/card.png" class = "img-fluid"alt="yugioh" />
    </div>

    <div class="memory-card" data-framework="backbone">
      <img class="front-face" src="<?php echo base_url();?>/resources/dist/img/lion.jpg" class = "img-fluid"alt="lion" />
      <img onclick = "incrementClick(); timer('1'); "id="back" class="back-face" src="<?php echo base_url();?>/resources/dist/img/card.png" class = "img-fluid"alt="yugioh" />
    </div>

    <div class="memory-card" data-framework="react">
      <img class="front-face" src="<?php echo base_url();?>/resources/dist/img/fairy_tail.png" alt="fairy_tail" />
      <img onclick = "incrementClick();timer('1');" id="back" class="back-face" src="<?php echo base_url();?>/resources/dist/img/card.png" class = "img-fluid"alt="yugioh" />
    </div>

    <div class="memory-card" data-framework="react">
      <img class="front-face" src="<?php echo base_url();?>/resources/dist/img/fairy_tail.png" class = "img-fluid"alt="fairy_tail" />
      <img onclick = "incrementClick(); timer('1');"id="back" class="back-face" src="<?php echo base_url();?>/resources/dist/img/card.png" class = "img-fluid"xalt="yugioh" />
    </div>

    <div class="memory-card" data-framework="ben10">
      <img class="front-face" src="<?php echo base_url();?>/resources/dist/img/ben10.png" class = "img-fluid"alt="fairy_tail" />
      <img onclick = "incrementClick(); timer('1');"id="back" class="back-face" src="<?php echo base_url();?>/resources/dist/img/card.png" class = "img-fluid"xalt="yugioh" />
    </div>

    <div class="memory-card" data-framework="ben10">
      <img class="front-face" src="<?php echo base_url();?>/resources/dist/img/ben10.png" class = "img-fluid"alt="fairy_tail" />
      <img onclick = "incrementClick(); timer('1');"id="back" class="back-face" src="<?php echo base_url();?>/resources/dist/img/card.png" class = "img-fluid"xalt="yugioh" />
    </div>

    <div class="memory-card" data-framework="ragnarok">
      <img class="front-face" src="<?php echo base_url();?>/resources/dist/img/ragnarok.png" class = "img-fluid"alt="fairy_tail" />
      <img onclick = "incrementClick(); timer('1');"id="back" class="back-face" src="<?php echo base_url();?>/resources/dist/img/card.png" class = "img-fluid"xalt="yugioh" />
    </div>

    <div class="memory-card" data-framework="ragnarok">
      <img class="front-face" src="<?php echo base_url();?>/resources/dist/img/ragnarok.png" class = "img-fluid"alt="fairy_tail" />
      <img onclick = "incrementClick(); timer('1');"id="back" class="back-face" src="<?php echo base_url();?>/resources/dist/img/card.png" class = "img-fluid"xalt="yugioh" />
    </div> -->
            
  </div> 

</div>  

  
          <script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
        <script src = "https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js"></script>
        <script src ="<?php echo base_url();?>resources/dist/js/script.js"></script>
        <script src="//cdn.jsdelivr.net/npm/sweetalert2@11"></script>
    </body>
</html>

顺便说一句,我在这个项目中使用了 Codeigniter 3、bootstrap 和 javascript。提前感谢您的回答,感谢您的帮助。

【问题讨论】:

  • 这个问题的代码太多了,只是想知道为什么你需要使用settimeout和其他控件。
  • 一开始,我的教授想在游戏中添加一个计时器,所以我在里面放了一个计时器。现在他希望游戏在找到一对卡片时暂停,并在点击/翻转卡片时恢复计时器
  • 你不能恢复定时器然后恢复它,你必须创建一个新的定时器。
  • 你能推荐我看或读的东西,以便我可以修改我的代码吗?

标签: javascript codeigniter sweetalert


【解决方案1】:

对于您的情况,您可以这样做,以便在确认警报(单击恢复)后启动一个新计时器:

Swal.fire({
  imageWidth: 150,
  imageHeight: 150,
  imageAlt: 'Custom image',
  confirmButtonText: 'Resume Game',
  allowOutsideClick: false,
}).then(() => {
  time()
})

还要在time() 函数之外初始化totalSeconds,这样当您再次调用它时,游戏时间不会重置为0

这是一个工作示例:

const cards = document.querySelectorAll('.memory-card')

let hasFlippedCard = false
let lockBoard = false
let firstCard, secondCard
let matchCounter = 0
let timerCtrl = null // store the return value of setInterval

function flipCard() {
  if (lockBoard) return
  if (this === firstCard) return

  this.classList.add('flip')

  if (!hasFlippedCard) {
    hasFlippedCard = true
    firstCard = this

    return
  }

  secondCard = this
  checkForMatch()
}

function checkForMatch() {
  let isMatch = firstCard.dataset.framework === secondCard.dataset.framework
  if (isMatch) {
    matchCounter += 1
    disableCards()
    Swal.fire({
      imageWidth: 150,
      imageHeight: 150,
      imageAlt: 'Custom image',
      confirmButtonText: 'Resume Game',
      allowOutsideClick: false,
    }).then(() => {
      time()
    })

    clearInterval(timerCtrl)
    if (matchCounter == cards.length / 2) {
      Swal.fire({
        title: 'Congratualtions!!!',
        text: 'You finish the game ' +
          counterVal +
          ' Moves. Thank you for playing',
        allowOutsideClick: false,
      })
      setTimeout(timerCtrl, 1000) // it will stop the timer
    }
  } else {
    unflipCards()
  }
}

function disableCards() {
  firstCard.removeEventListener('click', flipCard)
  secondCard.removeEventListener('click', flipCard)

  resetBoard()
}

function unflipCards() {
  lockBoard = true

  setTimeout(() => {
    firstCard.classList.remove('flip')
    secondCard.classList.remove('flip')

    resetBoard()
  }, 500)
}

function resetBoard() {
  hasFlippedCard = false
  lockBoard = false
  firstCard = null
  secondCard = null
}

;
(function shuffle() {
  cards.forEach(card => {
    let randomPos = Math.floor(Math.random() * 12)
    card.style.order = randomPos
  })
})()

cards.forEach(card => card.addEventListener('click', flipCard))

function restartButton() {
  location.reload()
}
var i = 0

function timer(id) {
  if (id == '1') {
    i++
    if (i === 1) {
      time()
    }
  } else if (id == '2') {
    //dri nimo e butang ang pause nga function
  } else if (id == '3') {
    //function for continue time
  }
}

var numr = 0

function countClick() {
  numr++
  console.log(numr)
}


var minutesLabel = document.getElementById('minutes')
var secondsLabel = document.getElementById('seconds')
var totalSeconds = 0

/*Timer*/
function time() {
  function setTime() {
    ++totalSeconds
    secondsLabel.innerHTML = pad(totalSeconds % 60)
    minutesLabel.innerHTML = pad(parseInt(totalSeconds / 60))
  }

  function pad(val) {
    var valString = val + ''
    if (valString.length < 2) {
      return '0' + valString
    } else {
      return valString
    }
  }
  timerCtrl = setInterval(setTime, 1000)
}

var counterVal = 0

function incrementClick() {
  updateDisplay(++counterVal)
}

function resetCounter() {
  counterVal = 0
  updateDisplay(counterVal)
}

function updateDisplay(val) {
  document.getElementById('counter-label').innerHTML = val
}
* {
  margin: 0;
  box-sizing: border-box;
}

body {
  background: url('https://github.com/FoxyStoat/memory-game/blob/master/assets/img/ignasi_pattern_s.png?raw=true');
}

h1 {
  font-weight: 400;
  text-shadow: 1px 1px 2px rgba(80, 80, 80, 0.6);
}

.container {
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
}

.memory-game {
  width: 340px;
  height: 340px;
  display: flex;
  flex-wrap: wrap;
  perspective: 100%;
  margin: 5px;
}

.memory-card {
  width: calc(25% - 10px);
  height: calc(33.333% - 10px);
  margin: 5px;
  /* position: relative; */
  /* transform: scale(1); */
  transform-style: preserve-3d;
  transition: transform 0.5s;
  box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.3);
}

.memory-card:active {
  transform: scale(0.97);
  transition: transform 0.2s;
}

.memory-card.flip {
  transform: rotateY(180deg);
}

.front-face,
.back-face {
  width: 100%;
  height: 100%;
  /* padding: 1px; */
  position: absolute;
  /* border-radius: 5px; */
  /* background: #1C7CCC; */
  backface-visibility: hidden;
}

.front-face {
  transform: rotateY(180deg);
}

.score-panel {
  text-align: left;
  width: 270px;
  margin-bottom: 10px;
  color: #0d0d0e;
}

.score-panel .stars {
  margin: 0;
  padding: 0;
  display: inline-block;
  margin: 0 5px 0 0;
  color: rgb(24, 23, 23);
}

.score-panel .stars li {
  list-style: none;
  display: inline-block;
}

.score-panel .timer {
  display: inline;
  position: absolute;
  left: 50%;
}

.score-panel .restart {
  float: right;
  cursor: pointer;
}

@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) {
  .memory-game {
    width: 860px;
    min-height: 880px;
  }
}

@media only screen and (min-device-width: 375px) and (max-device-width: 812px) {
  .memory-game {
    width: 860px;
    min-height: 880px;
  }
}

@media only screen and (min-device-width: 320px) and (max-device-width: 568px) {
  .memory-game {
    width: 860px;
    min-height: 880px;
  }
}

.swal-wide {
  width: 850px !important;
}
<script src="//cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<div class="container">
  <h1>Memory Game</h1>
  <section class="score-panel">
    <span>Moves <span id="counter-label">0</span></span>

    <div class="timer">
      <label id="minutes">00</label>:<label id="seconds">00</label>
    </div>

    <div class="restart">
      <button onclick="restartButton()" class="fa fa-repeat">Restart</button>
    </div>
  </section>
  <?php include("header.php")?>
  <div class="memory-game">
    <div class="memory-card" data-framework="aurelia">
      <img class="front-face" src="https://www.gravatar.com/avatar/b0ded36026e886f443a5a5adf371c493?s=48&d=identicon&r=PG" class="img-fluid" alt="fb" />
      <img onclick="incrementClick(); timer('1');" id="back" class="back-face" src="https://i.stack.imgur.com/kyqmB.jpg?s=64&g=1" class="img-fluid" alt="yugioh" />
    </div>
    <div class="memory-card" data-framework="aurelia">
      <img class="front-face" src="https://www.gravatar.com/avatar/b0ded36026e886f443a5a5adf371c493?s=48&d=identicon&r=PG" class="img-fluid" alt="fb" />
      <img onclick="incrementClick(); timer('1');" id="back" class="back-face" src="https://i.stack.imgur.com/kyqmB.jpg?s=64&g=1" class="img-fluid" alt="yugioh" />
    </div>
    <div class="memory-card" data-framework="vue">
      <img class="front-face" src="https://lh3.googleusercontent.com/a/AATXAJyjNLYmp4jfrFYKH3rIl_FxI-lAoVkYLfSZdJqW=k-s64" class="img-fluid" alt="js" />
      <img onclick="incrementClick(); timer('1');" id="back" id="back" class="back-face" src="https://i.stack.imgur.com/kyqmB.jpg?s=64&g=1" class="img-fluid" alt="yugioh" />
    </div>

    <div class="memory-card" data-framework="vue">
      <img class="front-face" src="https://lh3.googleusercontent.com/a/AATXAJyjNLYmp4jfrFYKH3rIl_FxI-lAoVkYLfSZdJqW=k-s64" class="img-fluid" alt="js" />
      <img onclick="incrementClick(); timer('1');" id="back" class="back-face" src="https://i.stack.imgur.com/kyqmB.jpg?s=64&g=1" class="img-fluid" alt="yugioh" />
    </div>
  </div>
</div>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多