HTML/JS基础答题游戏:单选按钮计分器分数无法累加求助
问题分析与解决方案
你遇到的核心问题有两个:
- 分数变量被重复初始化:
taskai变量定义在ivertinimas()函数内部,每次调用这个函数时,taskai都会被重新设置为0,就算答对加1,函数执行完后这个变量就被销毁了,下次调用又回到初始值0,自然无法累加分数。 - 表单提交会刷新页面:默认情况下,表单提交会触发页面刷新,这会重置所有JavaScript变量,就算解决了第一个问题,刷新后分数还是会回到0。
修复步骤
- 把分数变量移到函数外部:将
taskai定义在全局作用域(这里采用全局变量的简单方案,也可以用闭包封装),这样每次调用函数时都会基于之前的分数进行累加。 - 阻止表单默认提交行为:在
ivertinimas()函数中添加逻辑阻止表单提交的默认动作,避免页面刷新。 - 调整分数更新逻辑:确保每次答题后都能正确更新页面上的分数显示。
完整修复代码
<div> <h1 id="title">Klausimų žaidimas</h1> <h3>Už kiekveiną teisingą atsakymą duodamas vienas taškas.</h3> <h3 id="rezultatas">Rezultatas: 0</h3> <h4>Koks yra antras pagal aukštį kalnas pasaulyje?</h4> <form id="klausimai" onsubmit="return ivertinimas()"> <input type="radio" name="kalnas" value="everestas">Everestas<br> <input type="radio" name="kalnas" value="k2">K2<br> <input type="radio" name="kalnas" value="leipkalnis">Liepkalnis<br> <input type="submit" value="Pateikti atsakymą"> </form> </div> <script> // 将分数变量放在全局作用域,避免每次调用函数都重置 var taskai = 0; function ivertinimas() { var radios = document.getElementsByName("kalnas"); var answered = false; // 标记是否有选中的选项 for (var i = 0; i < radios.length; i++) { if (radios[i].checked) { answered = true; var ats = radios[i].value; if (ats === "k2") { alert("Atsakymas teisingas!"); taskai++; } else { alert("Atsakymas neteisingas. Teisingas atsakymas yra K2.") } break; } } // 更新页面上的分数显示 var suTaskai = "Rezultatas: " + taskai; document.getElementById("rezultatas").innerHTML = suTaskai; // 如果用户没选选项,提示并阻止提交 if (!answered) { alert("Pasirinkite atsakymą!"); } // 阻止表单默认提交行为,避免页面刷新 return false; } </script>
关键修改说明
- 把
var taskai = 0;移到了函数外面,成为全局变量,这样每次答对时taskai++会持续累加分数。 - 表单的
onsubmit改成了return ivertinimas(),函数最后返回false,阻止了页面刷新导致的变量重置。 - 初始化页面时,
rezultatas元素默认显示Rezultatas: 0,让用户一开始就能看到分数状态。 - 添加了
answered变量,处理用户未选择选项就提交的情况,给出友好提示。
内容的提问来源于stack exchange,提问作者Viltas S
相关产品推荐
相关产品推荐

