
html 表单默认会触发表单提交并刷新页面,若未显式阻止该行为,即使仅调用 javascript 函数(如 checkanswer()),也会导致页面重载——这是前端开发中常见却易被忽略的问题。
html 表单默认会触发表单提交并刷新页面,若未显式阻止该行为,即使仅调用 javascript 函数(如 checkanswer()),也会导致页面重载——这是前端开发中常见却易被忽略的问题。
在你的 app2.html 页面中,问题根源在于:表单元素 <form> 在用户按下回车键或点击提交时,会触发浏览器默认的提交行为(即 GET 请求当前页面),从而导致整个页面刷新。而你的 checkAnswer() 函数虽被调用,但执行后页面已重载,所有 JS 状态(如 currentStreak、totalCorrect、输入框内容等)均丢失,表现为“游戏莫名重启”。
✅ 正确解决方案:阻止表单默认提交行为
你需要在表单提交事件中显式调用 event.preventDefault(),以取消浏览器默认的页面跳转/刷新动作。推荐两种实现方式:
方式一:内联事件处理(快速修复)
修改 app2.html 中的 <form> 标签,添加 onsubmit 并阻止默认行为:
<form onsubmit="event.preventDefault(); checkAnswer();">
<input
type="text"
id="answer"
placeholder="Your answer"
autocomplete="off"
autofocus
/>
</form>⚠️ 注意:event 对象在此上下文中自动可用,无需额外声明。
立即学习“前端免费学习笔记(深入)”;
方式二:分离逻辑(更规范、推荐)
在 <script> 中为表单绑定事件监听器,提升可维护性与可测试性:
<form id="answerForm">
<input
type="text"
id="answer"
placeholder="Your answer"
autocomplete="off"
autofocus
/>
</form>document.getElementById('answerForm').addEventListener('submit', function (e) {
e.preventDefault(); // 关键:阻止默认提交
checkAnswer();
});? 额外建议与注意事项
避免递归调用风险:当前 newQuestion() 函数中使用了递归调用(newQuestion(); return;),在极端情况下可能导致栈溢出。建议改用 while 循环重试逻辑,确保问题不重复。
Cookie 逻辑优化:if (!cookie == "") 实际等价于 if (false == "")(永远为 true),应改为 if (cookie !== "");同理,if (!getCookie("bestScore") == "") 应修正为 if (getCookie("bestScore") !== "")。
输入校验增强:isAnswerOption() 中使用了未声明的全局变量 x(for (x = 0; ...)),应改为 let x = 0 或 for (let x = 0; ...),避免污染全局作用域。
调试技巧:可在 checkAnswer() 开头添加 console.log('checkAnswer called');,配合浏览器开发者工具的「Network」面板观察是否仍有请求发出,快速验证是否真正阻止了提交。
通过以上修改,你的三角函数练习游戏将稳定运行,不再因表单提交意外刷新,用户体验与数据持久性均可得到保障。



















