最近有个业务需求,需要做一个问卷表单
格式比较简单:问题+radio选项,问题需要分组展示,数据需要从数据库提取渲染。
细节较多

效果图如下

下面发一下前端完整代码(由于套用的是公司封装的layui框架,layui的js请自己引入)

html+js


<body>
<div><h1 id="headline">大标题</h1><br/><div class="fr"><button type="button" class="layui-btn" id="reset"><i class="layui-icon"></i>重置</button><button type="submit" class="layui-btn" id="submit" lay-submit=""><i class="layui-icon"></i>提交</button></div>
<!--    用了layui的tpl模板引擎--><div id="view"></div>
</div>
</body><script id="questionInfo" type="text/html"><div class="layui-row"><form class="layui-form"><ul>
<!--                对后台传过来的json数据进行遍历-->{{# layui.each(d.data, function(index, item){ }}
<!--                问题分类(即二级标题)--><blockquote style=" text-align: left " class="layui-elem-quote"><spanstyle="font-size: 18px;font-weight: bold">{{index+1}}.&nbsp;{{ item.secondTitle}}</span></blockquote>
<!--                遍历每二级标题下对应的问题--><li class="layui-form-item" style=" text-align: left;margin-left: 20px">{{# layui.each(item.list, function(key, value){ }}<label style="font-size: 18px;font-weight: normal"> <span>{{index+1}}.{{key+1}}&nbsp;&nbsp;{{ value.question}} </span></label><!--                问题提示功能,用了bootstrap的popover组件,若不需要可自行删除--><button class="layui-btn " type="button" data-toggle="popover" data-container="body"data-placement="right" data-content="{{value.notes}}" onclick="hide()"style=" height: 18px;line-height: 18px;padding: 0 8px;font-size: 10px">提示</button><div class="checkList">
<!--                根据我的客户需求,需要在渲染页面的时候,如果之前有过问卷提交记录,则radio自动渲染出上次所选的选项--><input type="radio" name="{{ value.id}}" lay-verify="required" required{{value.score=="1"?"checked":""}} value="1" title="准备实施"/><input type="radio" name="{{ value.id}}" lay-verify="required" required{{value.score=="2"?"checked":""}} value="2" title="正在实施"/><input type="radio" name="{{ value.id}}" lay-verify="required" required{{value.score=="3"?"checked":""}} value="3" title="已经实施"/></div>{{# }); }}</li>{{# }); }}</ul></form></div>
</script>
<script>function hide() {//这个函数用来控制popover插件几秒后消失,这里是1500mssetTimeout(function () {$("[data-toggle='popover']").popover('hide');}, 1500);}
</script><script src="${ctxPath}/static/js/jquery-2.1.3.min.js"></script>
<script src="${ctxPath}/static/js/bootstrap.min.js"></script>
<script>layui.use(['form', 'laytpl', 'layer'], function () {var  $ = layui.jquery, form = layui.form, layer = layui.layer, laytpl = layui.laytpl;form.render();//把每项问题的Id和其所选值存入mapvar map1 = new Map();//map转json(map -> object -> json)function MapToJson(map) {let obj = Object.create(null);for (let [k, v] of map) {obj[k] = v;}return obj;}var questionNumber = 0;//获取后台数据$.ajax({url: "/tbQuestionRecord/getQuestion",datatype: "json",type: "GET",async: false,//关闭异步,否则popover组件无法渲染出值context: document.body,success: function (data) {for (var i in data.data) {questionNumber += data.data[i].list.length;}var getTpl = questionInfo.innerHTML, view = document.getElementById('view');laytpl(getTpl).render(data, function (html) {view.innerHTML = html;});form.render();}})var TbQustionTechnologyInfo = {};//按钮操作TbQustionTechnologyInfo.initButton = function () {//提交信息$("#submit").click(function () {// 在提交之前需要遍历一遍所有的radio选项,并把所选对应值存入map,如果有漏选的,则提交不成功var dataList = $('.checkList').find('input');for (var b = 0; b < dataList.length; b++) {if ($(dataList[b]).prop('checked')) {console.log($(dataList[b]).prop('checked'));map1.set($(dataList[b])[0].name, $(dataList[b])[0].defaultValue);}}if (questionNumber == map1.size) {} else {layer.msg("请填写完所有选项");return false;}$.ajax({url:"/tbQuestionRecord/saveAnswer",contentType:"application/json",data:{map: MapToJson(map1),treeId: 1,},success:function (data) {if (data.code == "200") {alert(data.message);} else if (data.code == "500") {alert(data.message);}}})});//重置$("#reset").click(function () {window.location.reload();});}$(function () {TbQustionTechnologyInfo.initButton();   //初始化按钮操作form.render();$("[data-toggle='popover']").popover();});});
</script>

下面是前台调用到的json数据格式

{"data": [{"secondTitle": "问题分类第一组","list": [{//每个问题所属于的二级菜单的Id(即secondTitle的Id)"belongdemand": "2bf6a3191f5846629957d2974f879a9a",//问题Id"id": "19f26b2f364649c0958960870c5dcdb7",//问题的备注"notes": "1",//问题"question": "问题1.1",//问题所得分数"score": "1",//问题的前后排序"showorder": 5},{"belongdemand": "2bf6a3191f5846629957d2974f879a9a","id": "840339d2c64044129553542fab9ceb4b","notes": "2","question": "问题1.2","score": "2","showorder": 7},{"belongdemand": "2bf6a3191f5846629957d2974f879a9a","id": "6e31f891fb5745179897bd8b79b58ee7","notes": "4","question": "问题1.3","score": "2","showorder": 9}]},{"secondTitle": "问题分类第二组","list": [{"belongdemand": "e55cb74dc159437ca35d47461f8efe02","id": "1143d2c1c3914f95b032c92dc27d84d9","notes": "达瓦大挖的","question": "问题2.1","score": "","showorder": 1},{"belongdemand": "e55cb74dc159437ca35d47461f8efe02","id": "d22a6e1d6fbd4bf785b26715c315272f","notes": "达瓦打算达瓦w","question": "问题2.2","score": "","showorder": 2}]}]
}

由于业务需求不同,后端基本都是增删改查,就不放代码了。

如果遇到什么问题或代码有不对的地方,烦请指出和留言

开发过程中遇到的一些问题:

1.如何通过layui模板引擎循环遍历显示题目

2.如何在网页加载后显示上次提交的问题答案

3.如何在每次提交时拿到问题的所选答案,(我用的是map存放问题id和所选答案),并要求不能有漏选问题,否则无法提交。

layui 实现问卷表单【页面数据渲染+答案提交】【前端完整代码】相关推荐

  1. php表单登录跳转页面跳转页面,form表单页面跳转方式提交练习

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //form表单提交练习 /*新建一个form.html网页用来书写前端HTML表单*/ 表单提交练习 姓名: 年龄: 电话: 地址: QQ: 自我评价: ...

  2. php 提交表单跳转页面,form表单页面跳转方式提交练习

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //form表单提交练习 /*新建一个form.html网页用来书写前端HTML表单*/ 表单提交练习 姓名: 年龄: 电话: 地址: QQ: 自我评价: ...

  3. 登录form php一个页面跳转页面,form表单页面跳转方式提交练习

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //form表单提交练习 /*新建一个form.html网页用来书写前端HTML表单*/ 表单提交练习 姓名: 年龄: 电话: 地址: QQ: 自我评价: ...

  4. php form提交跳转,form表单页面跳转方式提交练习

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //form表单提交练习 /*新建一个form.html网页用来书写前端HTML表单*/ 表单提交练习 姓名: 年龄: 电话: 地址: QQ: 自我评价: ...

  5. 表单php跳转页面跳转,form表单页面跳转方式提交练习

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //form表单提交练习 /*新建一个form.html网页用来书写前端HTML表单*/ 表单提交练习 姓名: 年龄: 电话: 地址: QQ: 自我评价: ...

  6. php form action跳转,form表单页面跳转方式提交练习

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //form表单提交练习 /*新建一个form.html网页用来书写前端HTML表单*/ 表单提交练习 姓名: 年龄: 电话: 地址: QQ: 自我评价: ...

  7. form跳转php页面,form表单页面跳转方式提交练习

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //form表单提交练习 /*新建一个form.html网页用来书写前端HTML表单*/ 表单提交练习 姓名: 年龄: 电话: 地址: QQ: 自我评价: ...

  8. php 表单页面跳转,form表单页面跳转方式提交练习

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //form表单提交练习 /*新建一个form.html网页用来书写前端HTML表单*/ 表单提交练习 姓名: 年龄: 电话: 地址: QQ: 自我评价: ...

  9. 微信小程序开发之——调查问卷-编写表单页面(2.2.2)

    一 概述 本节介绍表单页面相关的内容: 编写调查问卷表单页面 编写调查问卷样式 设置导航栏标题 二 编写调查问卷表单页面 在微信开发者工具中创建一个新项目,然后在项目中创建pages/index/in ...

最新文章

  1. 【C语言】 strstr查找子字符串函数以及模拟实现讲解
  2. Homography matrix(单应性矩阵)在广告投放中的实践
  3. 【codeforces 807C】Success Rate
  4. Silverlight 游戏开发小技巧:轨迹跟随效果
  5. C语言system函数(C语言程序中执行命令行)
  6. 入门Java开发,这三大知识体系你要知道
  7. Apache-不重启完成添加或更改域名
  8. mysql分组获取其他字段_sqlserver group by后获取其他字段(多种方法)
  9. 对话阿里云叔同:释放云价值,让容器成为“普适”技术
  10. 12 - java 类加载内存图
  11. 检查linux的crontab服务,crontab任务调度健康检测
  12. linux安全技术课程报告,综合实例一+linux平台WEB安全技术研究报告.doc
  13. dfs时间复杂度_Python实现图的经典DFS、BFS、Dijkstra、Floyd、Prim、Kruskal算法
  14. python处理pcap文件_[转载]Python读取pcap文件
  15. linux 之 sed
  16. Visual Components 4.0仿真软件优势
  17. 机械革命 无界16pro闪屏
  18. (QT)qss与按钮
  19. 应用调试(三)oops
  20. star测试软件,PSTAR准备

热门文章

  1. 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr() ,这种方法在大部分情况下都是有效的。但是在通过了Apache,Squi...
  2. AD转换 ADC设计
  3. HTML详解——初识html(一)
  4. 外网访问arm嵌入式linux系统_嵌入式Linux系统移植的四大步骤
  5. Latex双栏格式下的摘要单栏+脚注设置
  6. python爬虫爬取股票评论,调用百度AI进行语义分析, matlab观察股票涨跌和评论的关系
  7. idc国内服务器销售排名,IDC:联想排名中国服务器市场榜首!
  8. js 判断当前的手机系统类型
  9. 美国FBA海运专线有哪些优势?
  10. CSS基础介绍(三)