前端应以服务端响应为准立即冻结界面并提交答案,而非依赖前端倒计时;需监听后端返回的time_up状态,禁用交互、添加遮罩、替换文案,并实时读取或采用服务端预填答案完成提交。

当后端接口返回“闯关答题倒计时结束,自动提交”这类状态时,前端 JavaScript 应立即终止用户交互、禁用所有操作,并触发最终答案提交逻辑(即使用户未手动点击提交)。关键不是等待倒计时归零再处理,而是**以服务端响应为准,前端做兜底和体验同步**。
监听后端返回的倒计时结束标识
后端通常会在答题接口响应中携带明确的状态字段,例如:
`{ "status": "time_up", "answers": [...], "score": 0 }`
或通过 HTTP 状态码(如 403 或自定义 208)配合 message 字段提示。JavaScript 需在请求回调(或响应拦截器)中识别该信号:
- 检查 response.data.status === 'time_up' 或 response.data.message.includes('超时');
- 若命中,立刻执行「冻结界面 + 提交答案」流程,不依赖前端计时器是否走完;
- 避免仅靠前端 setInterval 倒计时判断——网络延迟、页面切后台、系统时间篡改都可能导致不准。
冻结答题区域并展示结束态
倒计时结束后,用户不应再修改选项。需用 JS 快速锁定 UI:
- 禁用所有单选/多选 input、textarea 和提交按钮:
element.disabled = true; - 添加半透明遮罩层(如插入一个全屏
<div class="overlay"></div>),防止误触; - 将顶部倒计时文案替换为「时间已到,正在提交…」,并隐藏/禁用倒计时组件;
- 若有未保存的草稿输入,可保留只读显示(
contenteditable="false"),增强可信感。
构造并提交最终答案数据
即使用户没点“提交”,也要把当前已选答案发给后端存档。注意三点:
- 从 DOM 或组件 state 中实时读取用户最新选择(不要依赖缓存的旧数据);
- 若后端已返回预填答案(如
response.data.answers),优先使用它(说明服务端做了兜底判卷); - 提交时加 loading 状态、禁用重复点击,并在成功后跳转结果页;失败则提示「提交异常,请联系老师」并保留当前页面供手动重试。
补充:前端倒计时仅作提示,不做决策依据
前端可维护一个视觉倒计时(如每秒更新 <span id="timer">00:30</span>),但它的作用只是提醒,而非控制逻辑:
- 倒计时到 0 时,只触发 UI 提示(如震动、变色),不自动调用 submit;
- 真正提交动作必须等后端响应确认或主动轮询接口拿到 time_up 状态;
- 建议搭配短周期轮询(如每 5 秒 GET /api/exam/status)或 WebSocket 监听服务端推送,确保及时感知中断事件。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











