1,定义一个结果的对象:
let resultObj = { id: 0, name: "", questions: [], };
id,name和questions分别对应问卷id,问卷名称和问卷题目。
2,结果赋值
用户点击生成问卷按钮时, 分别从id和name文本框中获取值 --赋值给resultObj
resultObj.id = +document.getElementById("qid").value.trim(); resultObj.name = document.getElementById("qname").value.trim();
将上节课拿到的question赋值给刚刚定义的对象:
resultObj.questions = questions; resultJson = JSON.stringify(resultObj); console.log(resultObj);
打印输出结果:
json结果:
{ "id": 1, "name": "测试问卷", "questions": [ { "id": 1, "title": "题目1", "question_type": "radio", "question_type_text": "单选题", "options": [ { "option_id": "A", "option_value": "选项1" }, { "option_id": "B", "option_value": "选项2" }, { "option_id": "C", "option_value": "选项3" } ] }, { "id": 2, "title": "题目2", "question_type": "checkbox", "question_type_text": "多选题", "options": [ { "option_id": "A", "option_value": "选项4" }, { "option_id": "B", "option_value": "选项5" }, { "option_id": "C", "option_value": "选项6" } ] }, { "id": 3, "title": "单行文本题", "question_type": "input", "question_type_text": "填空题" } ] }
3,pretty-print-json的使用
引入pretty-print-json,将上述json输出结果,格式化并打印到json结果文本框中:
import { prettyPrintJson } from "pretty-print-json";
document.getElementById("json-preview").innerHTML = prettyPrintJson.toHtml(resultObj);
结果如下图:
4,copy-to-clipboard的使用
拷贝功能:
点击copy json按钮时,将jison数据拷贝到剪切板,因为拷贝的是一个字符串,而不是对象,这里需要通过将对象转换为字符串,然后进行copy操作:
首先定义一个字符串:
let resultJson = "";
将对象转换为字符串,并赋值给resultJson
resultJson = JSON.stringify(resultObj);
引入copy-to-clipboard依赖:
import copy from "copy-to-clipboard";
将resultJson拷贝到剪切板:
document.getElementById("copy").onclick = () => { copy(resultJson); alert("已复制到剪贴板"); };
拷贝弹框:
5,gotpl的使用
html游览功能
这是使用到gotpl依赖,它的作用是把一段模板用给定的数据对象渲染出来。
模板已经提前写好了,直接copy拿走:
//模板 const tpl = ` <div class="question"> <div class="row"> 问卷ID:<%= id %> </div> <div class="row"> 问卷名称:<%= name %> </div> <% for(var i=0, l=questions.length; i<l; ++i){ %> <% var item = questions[i]; %> <div class="question-wrap"> <div class="question-title"><%= item.id %>. <%= item.title %>【<%=item.question_type_text %>】</div> <% if(item.question_type === 'input'){ %> <div class="input"> <input type="text" name="<%= item.id %>" /> </div> <% }else if(item.question_type === 'radio'){ %> <div class="radio"> <% for(var j=0, k=item.options.length; j<k; ++j){ %> <label class="label"> <input type="radio" name="<%= item.id %>" value="<%= item.options[j].option_id %>" /> <%= item.options[j].option_id %>. <%= item.options[j].option_value %> </label> <% } %> </div> <% }else if(item.question_type === 'checkbox'){ %> <div class="checkbox"> <% for(var j=0, k=item.options.length; j<k; ++j){ %> <label class="label"> <input type="checkbox" name="<%= item.id %>" value="<%= item.options[j].option_id %>" /> <%= item.options[j].option_id %>. <%= item.options[j].option_value %> </label> <% } %> </div> <% } %> </div> <% } %> </div> `;
引入gotpl依赖:
import gotpl from "gotpl";
利用gotpl进行渲染模板—里面参数是前面是模板,后面是数据对象
document.getElementById("html-preview").innerHTML = gotpl.render( tpl, resultObj );
6,最终结果展示
生成问卷游览结果如下图(红框内容)
通过这个问卷编辑工具,我们手工编辑多套题,不用一道一道录入,就可批量完成问卷调查的设计工作。