前端加后端验证倒计时答题功能实现
2016-06-03 20:44
253 查看
思路
前端页面控制答题的开始,请求后台,后台记录开始的时间(发出请求的当前时间),再加上倒计时时间,得出结束时间。后端返回给前端剩余的时间,前端通过Jquery实现倒计时的动态效果。
当倒计时结束,禁止答题,当用户刷新页面时,比较请求时间与结束时间,如果前者小于后者,答题继续,否则反之。
其中,答题时间、开始时间、结束时间,均保存在内存中。
实现(SpringMVC+Jquery)
后端:/** * Copyright 2016 Zhengbin's Studio. * All right reserved. * 2016年6月3日 下午3:20:19 */ package zut.race.control.back; import java.util.Date; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; /** * @author zhengbinMac * */ @Controller @RequestMapping("test") public class TestTimeController { private static final Logger logger = Logger.getLogger(TestTimeController.class); private static long beginTime = -1; // 毫秒 private static long answerTime = 20 * 1000; // 毫秒 private static long endTime = -1; // 毫秒 /* * 1.裁判宣布开始答题 2.选手请求页面可以开始答题 3.选手中途关闭页面 4.倒计时结束,不可答题(前端加后端) */ @RequestMapping("/begin") public String begin(HttpServletRequest request, ModelMap model) { // 裁判规定答题时间'answerTime' String tempTime = request.getParameter("answerTime"); // 如果裁判没有规定答题时间,则为默认倒计时20秒 if (tempTime != null) { answerTime = (Integer.parseInt(tempTime) + 2) * 1000; // 毫秒 } // 记录裁判‘开始’的时间 beginTime = new Date().getTime(); // 毫秒 // 结束时间,开始时间加上答题时间 endTime = beginTime + answerTime; return "redirect:/test/answer.do"; } // 学生访问答题页面 @RequestMapping("/answer") public String answer(ModelMap model) { // 判断学生当前请求的时间是否在结束时间内 long nowTime = new Date().getTime(); if (beginTime == -1) { model.addAttribute("message", "比赛未开始!"); return "/index.jsp"; } // 如果学生当前请求的时间大于结束时间,返回‘答题结束’,否则可以‘继续答题’ if (nowTime >= endTime) { model.addAttribute("message", "答题结束!"); logger.info("答题结束,当前时间:" + nowTime); } else { model.addAttribute("message", "请继续答题!"); model.addAttribute("endTime", endTime - nowTime); } return "/index.jsp"; } }
前端:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <% response.setHeader("Cache-Control", "no-store"); response.setHeader("Pragrma", "no-cache"); response.setDateHeader("Expires", 0); %> <html xmlns="http://www.w3.org/1999/xhtml"> <script type="text/javascript" src="<c:url value='/js/jquery.min.js'/>"></script> <script type="text/javascript"> var a = 1001; $(function() { if ($("#endtime").val() != "") { a = $("#endtime").val(); } fomtime(); }); //以毫秒为单位 function fomtime() { if (a <= 1000) { console.log($("#message")); if ($("#message").text() == "请继续答题!") { $("#message").text("答题结束!"); } return; } a = a - 1000; var b = new Date(); b.setTime(0); var c = new Date(); c.setTime(a); var day1 = b.getDate(); //为方便调用,把天数、小时等单独定义 var hours1 = b.getHours(); var minu1 = b.getMinutes(); var seco1 = b.getSeconds(); var day2 = c.getDate(); var hours2 = c.getHours(); var minu2 = c.getMinutes(); var seco2 = c.getSeconds(); var day = day2 - day1; var hours = hours2 - hours1; var minu = minu2 - minu1; var seco = seco2 - seco1; document.getElementById('daya').innerHTML = day; document.getElementById('hoursa').innerHTML = hours; document.getElementById('minua').innerHTML = minu; document.getElementById('secoa').innerHTML = seco; setTimeout("fomtime()", 1000); } </script> <body> <input type="hidden" value="${endTime}" id="endtime" name="endtime" /> <p style="color: red;" color="red" id="message">${message}</p> <form action="<c:url value='/test/begin.do'/>"> <input type="text" name="answerTime"> <input type="submit" value="开始答题!"> </form> <div> 距答题结束还有: <span id='daya'></span>天 <span id='hoursa'></span>小时 <span id='minua'></span>分 <span id='secoa'></span>秒 </div> </body> </html>
*草草实现功能,代码不够优雅
相关文章推荐
- HTML编辑器
- css中清除浮动的主要方法
- React入门笔记(三) — 数据流
- css固定元素位置(fixed)
- 冒泡排序 & 选择排序 & 插入排序 & 希尔排序 JavaScript 实现
- HTML5入门----表单验证及实例
- html学习笔记-2016-6-3 19:21:04
- HTML5入门----表单元素(2)
- 初学js者必看的,用js做全选,不选,反选的选项卡(基础的)
- js中小心自动重构带来的问题
- Servlet与JSP九大内置对象的关系
- JavaScript:样式
- CSS——盒子模型
- 《剑指offer》:[13]对几万公司员工年龄的排序算法
- 自己动手制作基于jQuery的Web页面加载进度条插件
- CSS3:border-radius
- Reset css
- SICP 1.2.6素数检测 fermat检测
- JavaScript new与构造函数的那些事
- 初识React Native