[英]Function firing multiple times
有人可以帮我解决这块 Javascript 吗?
我正在尝试制作某种“打地鼠”游戏,这就是我想出的; 我设置了一种方法来跟踪分数,每次用户单击弹出的图片时添加 1(分数++)。 我的问题是,该代码运行ZC1C425268E68385D1AB5074C17A94F14F14Z比所需的次数多,例如,如果我单击了第一个弹出的图像,则ZC1C425268E68E68E68E68E68385D1AB507515151515157 IF FIRE INFIRES if FIRE COND +1 to GADS +1 firc1 to添加+1。两次,三次三次,等等……
我究竟做错了什么?
//gid
const grid = document.querySelector('.grid');
//score display value
const scoreValue = document.querySelector('#scoreValue');
//score
let score = 0;
const timer = setInterval(() => {
//output random number
let output = Math.floor(Math.random() * 16);
//select hole
let hole = document.getElementById(output);
hole.innerHTML = '<img src="img/kiseki.png" alt=""></img>';
setTimeout(() => {
hole.innerHTML = '';
}, 2000);
grid.addEventListener('click', e => {
if (e.target.tagName === "IMG") {
score++;
scoreValue.textContent = score;
console.log(score);
hole.innerHTML = '';
}
});
}, 4000);
由于您每次间隔运行时都会添加一个新的 eventListener ,因此为了解决您的问题,只需添加一次,然后再启动弹出moles
的 setInterval 。
示例代码:
const grid = document.querySelector('.grid');
const scoreValue = document.querySelector('#scoreValue');
const newMoleTimer = 4000;
const moleTimeout = 2000
let score = 0;
let hole;
grid.addEventListener('click', e => {
if (e.target.tagName === "IMG") {
score++;
scoreValue.textContent = score;
if(hole) hole.innerHTML = '';
}
});
const timer = setInterval(() => {
let output = Math.floor(Math.random() * 16);
hole = document.getElementById(output);
hole.innerHTML = '<img src="img/kiseki.png" alt=""></img>';
setTimeout(() => {
hole.innerHTML = '';
}, moleTimeout);
}, newMoleTimer);
*根据@Meika 评论更新代码
您需要将 eventlistener 与 settimer function 分开。
在此示例中,我创建了带有颜色的 div 元素。 只有蓝色得分并且只能得分一分。 计时器。
//gid const grid = document.querySelector('#grid'); //score display value const scoreValue = document.querySelector('#scoreValue'); //score let score = 0; grid.addEventListener('click', e => { if (e.target.score) { score++; scoreValue.textContent = score; e.target.score = false; } }); const timer = setInterval(() => { //output random number let output = 1 + Math.floor(Math.random() * 3); //select hole let hole = document.querySelector(`div.box:nth-child(${output})`) hole.classList.add('blue'); hole.score = true; setTimeout(() => { hole.classList.remove('blue'); hole.score = false; }, 1000); }, 2000);
div#grid { display: flex; } div.box { width: 100px; height: 100px; border: thin solid black; background-color: red; } div.blue { background-color: blue; }
<div id="grid"> <div class="box"></div> <div class="box"></div> <div class="box"></div> <div class="box"></div> </div> <div id="scoreValue"></div>
重写,一个痣是一个DOM元素,在加载时附加点击事件,然后在游戏计时器中你只需要选择一个随机的痣并切换一个class,在点击事件中你可以检查那个class,如果它是那么痣一定要显露出来,加一个分数。
例如:
const moles = document.querySelectorAll('.grid.mole') const hitScore = document.querySelector('.score.hit') const missScore = document.querySelector('.score.miss') const gameOver = document.querySelector('.gameover') let score = { hit: 0, miss: 0 } // assign clicks to all moles moles.forEach((elm) => { elm.addEventListener('click', e => { if (e.target.classList.contains('show')) { hitScore.textContent = ++score.hit e.target.classList.remove('show') } }) }) // game timer const timer = setInterval(() => { // get random mole element const randMole = moles[Math.floor(Math.random() * moles.length)] // check if has class, ie miss if (randMole.classList.contains('show')) { missScore.textContent = ++score.miss } // toggle show randMole.classList.toggle('show') // 5 misses and game over if (score.miss >= 5) { clearInterval(timer) gameOver.style.display = 'block' } }, 1000)
.grid { width: 310px; height: 310px; background-image: url(https://i.imgur.com/s6lUgud.png); position: relative }.mole { position: absolute; width: 100px; height: 100px }.mole.show { background-image: url(https://i.imgur.com/uScpWV4.png); background-repeat: no-repeat; background-size: 48px 51px; background-position: center }.mole:nth-of-type(1) { top: 0; left: 0 }.mole:nth-of-type(2) { top: 0; left: 108px }.mole:nth-of-type(3) { top: 0; left: 214px }.mole:nth-of-type(4) { top: 100px; left: 0 }.mole:nth-of-type(5) { top: 100px; left: 108px }.mole:nth-of-type(6) { top: 100px; left: 214px }.mole:nth-of-type(7) { top: 200px; left: 0px }.mole:nth-of-type(8) { top: 200px; left: 107px }.mole:nth-of-type(9) { top: 200px; left: 214px }.gameover { display: none; color: red }
<div class="score"> <strong>Score:</strong> Hit: <span class="hit">0</span> Miss: <span class="miss">0</span> </div> <div class="gameover">Game Over</div> <div class="grid"> <div class="mole"></div> <div class="mole"></div> <div class="mole"></div> <div class="mole"></div> <div class="mole"></div> <div class="mole"></div> <div class="mole"></div> <div class="mole"></div> <div class="mole"></div> </div>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.