仿造问卷星--开发一套调查问卷设计工具(2/3)--完整流程

本章主要内容是完善index.js逻辑功能。

1,修改index.html,直接copy

html和css文件直接从源码中拷贝:

html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>问卷设计工具</title><link rel="stylesheet" href="./index.css" /></head><body class="wrapper"><div class="row"><div class="form"><div class="row">问卷ID:<br /><input id="qid" type="text" value="1" /></div><div class="row">问卷名称:<br /><input id="qname" type="text" value="测试问卷" /></div><div class="row">问卷题目:<br /><textarea name="" id="text" cols="60" rows="20">1. 题目1选项1选项2选项32.题目2[多选题]选项4选项5选项63.单行文本题</textarea></div><div class="row"><button id="btn">生成问卷</button></div><div class="row">JSON结果:<br /><pre class="json-preview" id="json-preview"></pre></div><div class="row"><button id="copy">拷贝JSON内容</button></div></div><div class="result"><div class="row">问卷预览:<br /><div class="html-preview" id="html-preview"></div></div></div></div><div class="footer">Powered by<a href="https://webify.cloudbase.net/">CloudBase Webify</a></div><script type="module" src="./index.js"></script></body>
</html>

css

.form {float: left;min-height: 300px;padding: 20px;}.row {clear: both;margin: 5px 0;}.row::after {content: "";display: table;clear: both;}.result {float: left;margin-left: 20px;}.question-wrap {padding: 20px;}.question-wrap:hover {background-color: #f5f5f5;}.label {display: block;margin: 5px;}.html-preview {width: 500px;box-sizing: border-box;padding: 20px;border: solid 1px #ccc;}.json-preview {width: 500px;height: 100px;border: solid 1px #ccc;overflow: scroll;}

html结构说明:

从上到下:问卷id(输入框),问卷名称(输入框),问卷题目(文本框 存放对象数据),生成问卷(button按钮),JSON结果(文本框),拷贝JSON内容(button按钮)。

其中,用户点击 生成问卷(button按钮),右边生成一个问卷游览;并且把这套问卷的json题目展示到JSON结果文本框中,用户点击 拷贝JSON内容(button按钮),可以将JSON结果文本框中的内容拷贝到剪切板,方便粘贴到其他使用。

2,运行index后,界面如下图

在这里插入图片描述

3,在index.js中添加“生成问卷” button按钮的点击事件:

从text富文本中拿到内容并把用户输入的内容打印输出

document.getElementById("btn").addEventListener("click", function () {// 用户输入的字符串let text = document.getElementById("text").value;console.log(text);})

打印输出结果如下:
在这里插入图片描述

对打印输出的富文本内容进行修改

4,按空行分割题目,生成数组并打印输出:

利用正则表达式,使用string.split方法,里面传一个正则表达式,将字符串进行空行分割。
在这里插入图片描述
没有文字内容,只有空内容。


//正则表达式  除了空白和换行,其他什么都没有,就是一个空行
const regexQuestionSplit = /\n\s*\n/gm;document.getElementById("btn").addEventListener("click", function () {// 用户输入的字符串let text = document.getElementById("text").value;console.log(text);// 按空行分割题目let questionArr = text.split(regexQuestionSplit);console.log(questionArr);})

分割的输出数组结果:
在这里插入图片描述

开始对每个题目进行处理,分割每一行

  let questions = [];// 开始对每个题目进行处理questionArr.forEach((q) => {// 分割每一行let rows = q.split(regexQuestionRowSplit);//console.log(JSON.stringify(rows));// 去掉空行rows = rows.filter((item) => item.trim() !== "");// console.log(JSON.stringify(rows));// 全部去掉前后空格rows = rows.reduce((acc, cur) => {return [...acc, cur.trim()];}, []);console.log(JSON.stringify(rows));})

输出结果如下:
在这里插入图片描述

5,对填空题,单选题和多选题分别利用正则表达式来处理:

import { prettyPrintJson } from "pretty-print-json";
import copy from "copy-to-clipboard";
import gotpl from "gotpl";const regexQuestionSplit = /\n\s*\n/gm;
const regexQuestionRowSplit = /\n/gm;
const regexTitle1 = /(?<index>\d+)[.][\s]*(?<title>[^\n]*)$/;
const retexTitle2 =/(?<index>\d+)[.][\s]*(?<title>[^\[]*)[\[](?<type>\W+)[\]]$/;
let resultObj = {id: 0,name: "",questions: [],
};
let resultJson = "";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>
`;const alphabet = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
];
const type_map = {填空题: "input",单选题: "radio",多选题: "checkbox",
};
function getQuestionType(questionType) {return type_map[questionType] || "类型错误";
}
function formatQuestion(index, title, typeText, options = null) {// console.log(index, title, questionType);const questionType = getQuestionType(typeText);let question = {id: +index,title: title,question_type: questionType,question_type_text: typeText,};// console.log(options);if (options && options.length) {let tmpOptions = [];options.forEach((item, index) => {tmpOptions.push({option_id: alphabet[index],option_value: item,});});question.options = tmpOptions;}return question;
}document.getElementById("btn").addEventListener("click", function () {resultObj.id = +document.getElementById("qid").value.trim();resultObj.name = document.getElementById("qname").value.trim();// 用户输入的字符串let text = document.getElementById("text").value;// console.log(text);// 按空行分割题目let questionArr = text.split(regexQuestionSplit);// console.log(questionArr);let questions = [];// 开始对每个题目进行处理questionArr.forEach((q) => {// 分割每一行let rows = q.split(regexQuestionRowSplit);// console.log(JSON.stringify(rows));// 去掉空行rows = rows.filter((item) => item.trim() !== "");// console.log(JSON.stringify(rows));// 全部去掉前后空格rows = rows.reduce((acc, cur) => {return [...acc, cur.trim()];}, []);// console.log(JSON.stringify(rows));// 如果是单行,是填空题if (rows.length === 1) {if (regexTitle1.test(rows[0])) {let matches = rows[0].match(regexTitle1);// console.log(matches);let { index, title } = matches.groups;questions.push(formatQuestion(index, title, "填空题"));}}// console.log(questions);// 多行,可能是单选或多选if (rows.length > 1) {// 第一行是标题,其他行是选项let [titleRow, ...options] = rows;// console.log("titleRow", titleRow);// console.log("options", options);// 先验证带题目类型的格式if (retexTitle2.test(titleRow)) {let matches = titleRow.match(retexTitle2);//  console.log(matches)let { index, title, type } = matches.groups;questions.push(formatQuestion(index, title, type, options));} else if (regexTitle1.test(titleRow)) {// 没有设置类型的,当成单选题let matches = titleRow.match(regexTitle1);let { index, title } = matches.groups;console.log(index, title, options);questions.push(formatQuestion(index, title, "单选题", options));}// console.log(questions);}});resultObj.questions = questions;resultJson = JSON.stringify(resultObj);console.log(resultObj);document.getElementById("json-preview").innerHTML =prettyPrintJson.toHtml(resultObj);document.getElementById("html-preview").innerHTML = gotpl.render(tpl,resultObj);
});document.getElementById("copy").onclick = () => {copy(resultJson);alert("已复制到剪贴板");
};

6,输出最终结果:

在这里插入图片描述

输出的json数据如下:

[{"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": "填空题"},{"id": 4,"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"}]}
]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/44963.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python自动化问卷填写-问卷星(含完整代码)

目录 一、环境安装二、代码分析&#xff08;一&#xff09;库的引用&#xff08;二&#xff09;驱动的运行&#xff08;三&#xff09;各类题型的程序&#xff08;四&#xff09;主程序&#xff08;根据问卷客制&#xff09; 三、完整代码 由于网上的问卷星填写代码良莠不齐&am…

Python自动化填写问卷星问卷

本文使用pyhton实现常见的问卷星问卷自动化填写。如果出现智能验证&#xff0c;本文还不能有效绕过问卷星提交时出现的智能检测&#xff0c;还需要手动点击智能检测才能完成问卷的填写。 在网络问卷中&#xff0c;我们常见的问题有单选题、多选题和李克勤量表题&#xff0c;如下…

python自动填写问卷星

python自动填写问卷星 参考链接1 参考链接2 用python实现自动填问卷&#xff0c;通过智能验证以及滑动验证 1. 下载浏览器驱动 python自动化填写问卷需要依赖浏览器驱动,这里使用的是谷歌浏览器&#xff0c;所以需要下载chromedriver&#xff0c;且下载的版本要和浏览器版本…

问卷星问卷数据怎么快速导入SPSSAU?

最近收到小伙伴询问问卷星导入的问卷数据怎么编码&#xff1f; 现在的问卷调查&#xff0c;很多都是通过网络问卷的方式进行&#xff0c;问卷星是一个专业的在线问卷调查、测评投票平台&#xff0c;如果你的问卷正好是在问卷星网站发放&#xff0c;填答&#xff0c;回收数据&am…

python问卷星模拟提交

*一、前言 ** 笔者在家闲得无聊&#xff0c;突然想突破一下问卷星的反爬虫机制&#xff0c;顺便刷刷问卷&#xff0c;于是就开始分析了。 ** 二、分析过程 ** 1、fiddler抓包 模拟提交首先当然是打开fiddler看看提交了什么包啦。 2、分析不变参数 我们先来看不变的参数&…

使用python实现问卷星自动答题功能——基础篇

题主在学习的过程中&#xff0c;老是有人来让填问卷星&#xff0c;就觉得人填的很麻烦&#xff0c;于是就自己动手写了一个python脚本来实现自动填写问卷星 1.首先我们得学会使用python里面的一个库&#xff0c;selenium&#xff0c;这个库是用来专门面对浏览器的一个库&#…

用Python实现问卷星自动填写(超详细!!!)

用Python实现问卷星自动填写&#xff08;超详细&#xff01;&#xff01;&#xff01;&#xff09; 前言一、配置环境1.1安装依赖1.2安装驱动 二、实战处理2.1、引入库函数2.2、程序所需函数详解&#xff08;1&#xff09;自定义单选函数&#xff08;2&#xff09;自定义多选函…

自动填写问卷星并提交

自动填写问卷星并提交 鉴于好多小伙伴要做数据分析的时候发放大量的问卷&#xff0c;但收回来的却寥寥无几&#xff0c;还受到其他小伙伴的冷眼&#xff0c;所以在下决定通过代码的方式&#xff0c;来实现问卷星的自动填写并提交。 以谷歌浏览器为例 1.随便到一个页面&#x…

【python】自动填写问卷星问卷及提交

前言&#xff1a;问卷是很好的网络调查方式之一&#xff0c;近年来&#xff0c;问卷星被广泛应用于各方面的调查。本文介绍了利用python代码自动填写问卷星基本题目&#xff0c;拥有自动填写、解决智能验证、批量提交问卷等功能。 目录 1.下载浏览器驱动 2. selenium基本配置…

利用GoogleTampermonkeyModify Headers实现问卷星调查问卷的自动填写提交

前言 首先一个月没有更新博客&#xff0c;是因为去苏州尝试了一下暑假工&#xff0c;然后对于大家在博客留下的评论和问题也没有来得及回复&#xff0c;实在不好意思。不得不说&#xff0c;暑假工挺累的&#xff0c;而且基本上在消磨时间&#xff0c;说实话也不算后悔&#xf…

Python实现问卷星调查问卷自动填写

文章目录 前言一、配置环境1.1 下载依赖selenium1.2 安装chrome驱动1.3 引入库 二、简易版快速上手教程1.自定义变量2.自定以函数3 主函数编写 三 逐步解析1 基础代码2 实现步骤 四 代码总结 前言 如何使用python实现对问卷的自动填写提交任务并且还能解决智能验证问题。 一、…

Mac 软件出现「意外退出」及「打不开」解决方法

解决方法 方法其实有很多种&#xff0c;这里介绍常用的几种 终端法需先安装Xcode或Apple命令行工具 如未装Xcode可以使用下列命令安装Apple命令行工具&#xff08;如安装有Xcode可忽略&#xff09; xcode-select --install 1.终端法 sudo codesign --force --deep --sign -…

postman能正常打开但不显示窗口

1.最近使用postman偶尔出现以下问题 postman在任务栏能正常打开&#xff0c;如下图&#xff0c;使用AltTab也能看到&#xff0c;但是窗口就是显示不了 2.解决方案 将鼠标放在任务栏上&#xff0c;使用快捷键Alt空格&#xff0c;弹出小窗口&#xff0c;然后点击弹框中的最大化…

MPAndroidChart的HorizontalBarChart数值显示不全问题

现在使用的版本是&#xff1a;v3.1.0 方案一&#xff1a; private HorizontalBarChart hor_bar_chart; hor_bar_chart(HorizontalBarChart) findViewById(R.id.hor_barchart); YAxis leftYAxishor_bar_chart.getAxisLeft(); // 设置y轴边距&#xff0c;解决数值过大显示不全问…

解决 echarts 图中 tooltip 文本内容太长导致显示不全

问题&#xff1a; 使用 tooltip 的 extraCssText&#xff0c;高效方便 tooltip: {show:true,trigger: "axis",confine: true, // 文本太长自动换行extraCssText: white-space: normal; word-break: break-all;, // 文本太长自动换行效果&#xff1a;

CoordinatorLayout显示不全问题

问题一 <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"android:layout_width"match_parent"android:layout_height&…

在html中页面不全,网页显示不全,教您网页显示不全怎么办

当我们在电脑系统中使用IE浏览器浏览网页时&#xff0c;偶尔会出现是否只查看安全内容的提示&#xff0c;甚至有可能会出现页面显示不全的情况。一般遇到这种情况会选择继续查看网页内容&#xff0c;怎么去处理&#xff1f;下面&#xff0c;小编给大家介绍网页显示不全的解决步…

CSS问题:导航栏设置通栏后,放大页面背景显示不全

问题描述&#xff1a; 正常显示时&#xff1a;将网页放大到150%后&#xff1a; 解决办法&#xff1a; 当导航栏设置为width:100%或不给宽&#xff0c;是相当于当前文档流而言的&#xff0c;也就是浏览器窗口的大小。 此时假设浏览器窗口大小为1000px&#xff0c;那么这个通栏…

关于小程序 input 组件内容显示不全(显示的长度不满 input 宽度)问题

今天在做表单的提交&#xff0c;其中input框出现了一个诡异的问题&#xff0c;就是内容显示不全&#xff08;显示的长度不满 input 宽度&#xff09;&#xff0c;用前愆訾的文章解决&#xff0c;地址http://www.cnblogs.com/miu-key/p/7168933.html。感谢博主~ 转载自&#xff…