如何让CheckUpgrades函数中第二个if语句满足条件后仅执行一次
解决条件块仅执行一次的问题
嘿,我来帮你搞定这个需求!你想要让第二个if语句的逻辑只触发一次,之后不管定时器怎么调用CheckUpgrades都不再执行,对吧?这其实很容易实现,核心思路就是加一个状态标志来记录这个操作是否已经完成过。
下面给你两种可行的方案:
方案一:使用全局标志变量
这是最直观的方式,定义一个全局变量来追踪操作是否执行过:
// 初始化标志:false表示还没执行过隐藏操作 let hasHiddenUpgrades = false; function CheckUpgrades(){ if(cookies >= 1000){ document.getElementById("upgrades").style.removeProperty("display"); } // 只有当条件满足且未执行过时,才进入逻辑 if (clickMultiplier == 2 && !hasHiddenUpgrades){ document.getElementById("upgrades").style.display = "none"; // 执行后把标志设为true,锁定后续执行 hasHiddenUpgrades = true; // cookies = cookies - 500; MAKES IT GO IN REVERSE } }
原理很简单:hasHiddenUpgrades就像一个一次性开关,第一次满足clickMultiplier == 2时,开关被触发,执行隐藏操作后立刻把开关“锁死”(设为true),之后定时器再调用函数时,这个if条件就永远不会成立了。
方案二:使用DOM元素的dataset存储状态
如果你不想用全局变量(避免全局污染),可以把状态直接绑定到目标DOM元素的dataset属性上,更优雅:
function CheckUpgrades(){ // 先获取目标元素,避免重复查询DOM const upgradesElement = document.getElementById("upgrades"); if(cookies >= 1000){ upgradesElement.style.removeProperty("display"); } // 检查条件+元素是否未被标记为已隐藏 if (clickMultiplier == 2 && !upgradesElement.dataset.hasBeenHidden){ upgradesElement.style.display = "none"; // 给元素添加标记,标记已执行过隐藏 upgradesElement.dataset.hasBeenHidden = "true"; // cookies = cookies - 500; MAKES IT GO IN REVERSE } }
这种方式把状态和对应的DOM元素绑定在一起,不需要额外的全局变量,代码更整洁,尤其适合小型项目或单元素场景。
内容的提问来源于stack exchange,提问作者Joris2110
相关产品推荐
相关产品推荐

