+1按钮小游戏异常:金额6-9美元时2倍购买按钮误启用问题
问题原因
你出现这个bug的核心原因是执行了字符串的字典序比较,而非数字大小比较:
- 代码里
document.getElementById("money").innerHTML取到的是字符串类型的值,你把它和字符串"50"做比较时,JS会按字符的Unicode编码逐位比对 - 当金额是6-9时,取到的字符串是
"6"~"9",第一位字符的编码比"50"的第一位"5"大,所以"6" >= "50"的判断结果会返回true,按钮就提前启用了
修复方案
方案1(更推荐):直接使用已定义的数字变量money做判断
你本身已经维护了数字类型的全局变量money,完全不需要读取DOM的值做判断,还可以删掉无用的高频定时器,把判断逻辑放到addOne函数里执行,性能更好:
var money = 0; // 按钮状态更新逻辑复用 function updateButtonStatus() { document.getElementById("timesTwoButtonShop").disabled = money < 50; } function addOne() { money++; document.getElementById("money").innerHTML = money; // 每次金额更新后同步更新按钮状态 updateButtonStatus(); } // 页面初始化时执行一次,保证初始状态正确 updateButtonStatus(); // 可删除原来的setInterval轮询逻辑
方案2:如果需要读取DOM值做判断,先转成数字类型再比较
如果你一定要保留定时器逻辑,要把取到的DOM值转成数字再做比较:
window.setInterval(function(){ // 把字符串转成数字后再做大小比较 const currentMoney = Number(document.getElementById("money").innerHTML); document.getElementById("timesTwoButtonShop").disabled = currentMoney < 50; }, 1);
内容的提问来源于stack exchange,提问作者user16262715
相关产品推荐
相关产品推荐

