javascript - 如何在进度条完成之前禁用 onlick 事件?
问题描述
这是我的 JSFiddle:https ://jsfiddle.net/y6pnq7k5/3/
抱歉,如果代码太多,我试图缩小范围。
要查看的主要函数是 generatorClicked() 和 progressBarAnimation()。
当您单击框(例如火咒书)时,我有一个跨越 div 的进度条动画。问题是,如果您点击 div 垃圾邮件,它将在开始时重置进度条,并且因为这是一个空闲游戏,所以进度条在完成工作之前不会受到影响。我尝试过的一种解决方案是通过样式禁用指针事件:
var isClicked = true;
document.GetElementByID(this.id).style.pointerEvents = 'none';
//progress bar animation - after it's done isClicked = false
if(!isClicked) {
document.GetElementByID(this.id).style.pointerEvents = 'auto';
}
这存在问题,即在第一个进度条完成后进度条不可点击,或者它仍然允许点击垃圾邮件重置进度条,这取决于我将 isClicked 设置为 false 的位置。
我也尝试过像这篇文章中的最佳答案一样创建一个盾牌
这只是阻止了进度条的移动。
我没有任何库,只有香草 JS。我知道我对这个进度条动画的实现也很可疑,但即使我重构它,我仍然需要进度条不受后续点击的影响,因为它会影响游戏玩法。
解决方案
pointer-events CSS 属性可以在进度条动画开始之前设置为“无”,并在进度条动画停止后重置为其原始值。
var fireGenerators = ["fireSpellTome", "fireWizard", "fireTeacher", "fireSchool"];
var fireGeneratorStrings = ["Fire Spell Tome", "Fire Wizard", "Fire Teacher", "Fire School"];
var fireGeneratorAmount = new Array();
function initFireGenerators() {
for (i = 0; i < fireGenerators.length; i++) {
fireGeneratorAmount.push(0);
var div = document.createElement('div');
div.id = fireGenerators[i];
div.className = "fireGenerators";
div.innerHTML = fireGeneratorStrings[i];
div.onclick = generatorClicked;
var progressBar = document.createElement('div');
progressBar.id = fireGenerators[i] + "ProgressBar";
progressBar.className = "progressBar";
var amount = document.createElement('span');
amount.id = "amountFireGen" + i;
amount.class = "fireAmounts";
amount.innerHTML = "0";
div.appendChild(progressBar);
div.appendChild(amount);
main.appendChild(div);
}
}
function generatorClicked() {
console.log(this.id + " clicked");
progressBarAnimation(this.id);
}
function progressBarAnimation(parentID) {
const progressBarContainer = document.getElementById(parentID);
const progressBar = document.getElementById(parentID + "ProgressBar"); //Get progressBar div element
let id = null;
let currentWidth = 0; //Set the width to 0
clearInterval(id);
progressBarContainer.style.pointerEvents = "none";
id = setInterval(frame, 10); //TEMPORARY - Need to check what generator and match progress with speed
function frame() {
if (currentWidth == 330) {
clearInterval(id);
progressBar.style.width = "0px";
progressBarContainer.style.pointerEvents = "auto";
} else {
currentWidth++;
progressBar.style.width = currentWidth + "px";
}
}
return true;
}
initFireGenerators();
html, body {
height: 100%;
width: 100%;
margin: 0;
font-family: Arial, Helvetica, sans-serif;
user-select: none;
-webkit-user-select: none;
-moz-user-select: none;
-khtml-user-select: none;
-ms-user-select: none;
}
div span {
margin-left: 15px;
}
#main {
width: 100%;
height: 80%;
}
#fireSpellTome {
background-size: 100% 100%;
background-image: url('../images/firetome.png');
background-repeat: no-repeat;
}
.fireGenerators {
position: relative;
width: 330px;
height: 170px;
border:2px solid #000;
margin-top: 1px;
}
.progressBar {
position: absolute;
top: 0;
width: 0;
height: 100%;
background-color: #111;
opacity: 0.5;
}
.noPointers {
pointer-events: none;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="stylesheets/game.css">
</head>
<body>
<h1><span id="fireMagicAmount">0</span><br></h1>
<div id=main></div>
</body>
</html>
推荐阅读
- azure-active-directory - 如何使用 Sql 身份验证方法 ActiveDirectoryInteractive 启用“记住我”?
- c++ - OpenCL 挂起 cl::Context 销毁
- sql-server - 我正在尝试将 ASP.NET CORE API 版本 3.1 部署到本地 IIS Hostiing 但无法连接到 SQL Server
- javascript - Ionic on change 事件无法正常工作
- javascript - 如何用 jest 运行 babel-plugin-tester?
- selenium-webdriver - 无法读取设备场上的属性文件:- src/test/resources/Properties/Android_Or.properties -error
- wildfly - 如何在 KeyCloak 中禁用所有形式的本地缓存?
- angular - Angular-slickgrid 无法读取未定义的属性“hostView”
- python - 如何获得有猫的列
- javascript - 等待处理结束后再将其保存到数据库 [解决]