当前位置: 首页 > news >正文

yield生成器生成表单字段,并进行验证,利用fetch方法和formData对象传递数据给后端,后端返回成功,返回数据

这里主要利用生成器函数生成配置的表单字段;然后设置验证规则;验证用户填写的数据信息;
验证通过后,利用fetch异步传递方法将formdata数据传给后端;后端再进行验证返回数据
formfieldgenerator.js文件


//生成器函数,主要用于生成表单的各字段
//参数fields是字段配置表
function * formFieldGenerator(fields)
{for(const field of fields){let fieldHtml='';switch(field.type){case 'text':case 'email':case 'password':fieldHtml=`<div class="${field.className||''}"><label>${field.label} <input type="${field.type}" name="${field.name}" value="${field.value||''}" placeholder="${field.placeholder||''}" autocomplete="off"></label><p id="${field.name}"></p></div>`;break;case 'textarea':fieldHtml=`<div class="${field.className||''}"><label>${field.label}<textarea name="${field.name}" rows="${field.rows||5}" cols="${field.cols||10}" placeholder="${field.placeholder||''}"></textarea></label></div>`;break;case 'checkbox':fieldHtml=`<label><input type="${field.type}" name="${field.name}" value="${field.value}">${field.label}</label>`;  break;case 'submit':fieldHtml=`<div class="${field.className||''}"><label><input type="submit" name="${field.name}" id="${field.id}" value="${field.value}"></label></div>`;break;case 'button':fieldHtml=`<div class="${field.className||''}"><label><input type="button" name="${field.name}" id="${field.id}" value="${field.value}"></label></div>`;break;default:fieldHtml=`<!--不支持的字段类型:${field.type}>`;                          }//最后一定要yield fieldHtmlyield fieldHtml;}
}
//验证各字段用户填写的数据,如果验证没通过isValid返回假,验证通过isValid返回true
function validateForm(formData)
{let isValid=true;//各段的错误信息let msg={usernameMsg:'',pwdMsg:'',pwd2Msg:'',emailMsg:'',};let firtPwd='';for(const field of formData){const inputEle=document.querySelector(`[name="${field.name}"]`);if(!inputEle){continue;}//获取字段名进行验证switch(field.name){case 'username':let user=document.getElementById('username');if(inputEle.value.trim().length<=4 || inputEle.value.trim().length>=21){isValid=false;msg.usernameMsg='账户介于5-20个字符之间';}if(/^[\u4e00-\u9fa5]+$/.test(inputEle.value.trim())){isValid=false;msg.usernameMsg='账户不支持汉字';}if(msg.usernameMsg!==''){user.innerText=msg.usernameMsg;}else{msg.usernameMsg='';user.innerText='';user=null;}formdata.append('username',inputEle.value.trim());break;case 'pwd':let p2=document.getElementById('pwd');if(inputEle.value.trim().length<6||inputEle.value.trim().length>21){isValid=false;msg.pwdMsg='密码介于6-20个字符';} if(!/[A-Z]/.test(inputEle.value.trim())){isValid=false;msg.pwdMsg='密码必须包含大写字符';} if(msg.pwdMsg!==''){p2.innerText=msg.pwdMsg;}else{msg.pwdMsg='';p2.innerText='';p2=null;}firtPwd=inputEle.value.trim();formdata.append('pwd',inputEle.value.trim());break;case 'pwd2':let p3=document.getElementById('pwd2');if(inputEle.value.trim().toString()!==firtPwd.toString()){isValid=false;msg.pwd2Msg='两次密码不一致';}if(msg.pwd2!==''){p3.innerText=msg.pwd2Msg;}else{msg.pwd2Msg='';p3.innerText='';p3=null;}    break; case 'email':let mail=document.getElementById('email');if(inputEle.value.trim()===''){isValid=false;msg.emailMsg='邮件不能为空';}                 if(!/^\w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)*/.test(inputEle.value.trim())){isValid=false;msg.emailMsg='邮件格式不正确';}    if(msg.emailMsg!==''){mail.innerText=msg.emailMsg;}else{mail.innerText='';msg.emailMsg='';mail=null;}formdata.append('email',inputEle.value.trim());break;        }}//所有验证都通过则返回truereturn isValid;
}
//字段配置表,根据自己的需要进行配置
const formFields=[{name:'username',type:'text',placeholder:'用户名',label:'账&emsp;号&emsp;',className:'regInput'},{name:'email',type:'email',placeholder:'电子邮件',label:'邮&emsp;件&emsp;',className:'regInput'},{name:'pwd',type:'password',label:'密&emsp;码&emsp;',className:'regInput'},{name:'pwd2',type:'password',label:'重复密码',className:'regInput'},{name:'checkbox',name:'agree',type:'checkbox',label:'同意条款',value:'yes'},{name:'btn',type:'submit',value:'提交',id:'btn1',className:'regInput'},];//创建表单
const formHtml=document.createElement('form');
//设置表单属性
formHtml.setAttribute('method','post');
formHtml.setAttribute('name','form1');
formHtml.setAttribute('id','form1');
//将表单字段做为参数给到生成器函数,并添加入表单
formHtml.innerHTML=Array.from(formFieldGenerator(formFields)).join('');
let container=document.getElementById('container');
//做为字元素添加到html内
container.appendChild(formHtml);let btn=document.getElementById('btn1');
//为表单添加事件
formHtml.addEventListener('submit',function(event){event.preventDefault();//除去提交按钮const formData=formFields.filter(field=>field.type!=='submit');//如果验证都通过则将表单给FormData()对象进行序列化if(validateForm(formData)){//防止第2次提交,禁止提交按钮btn.disabled=true;let form1=document.getElementById('form1');let formVal=new FormData(form1);//检查FormData()对象里面的是否有表单各项与值for(let xx of formVal.entries()){console.log(xx);}//添加标头,如果是FormData()提交一要写form-data,千万不能写错了,其它的后端接收不到值为空//你也可以不写标头,让fetch自行判断let jsonheader=new Headers({"Content-Type":"application/form-data"});fetch('formfieldgenerator.php',{method:'POST',body:formVal}).then((response)=>{if(response.ok && response.status===200){return response.json();}throw new Error('返回数据错误');    }).then((data)=>{let result=JSON.stringify(data);let res=JSON.parse(result);console.log(res.username);}).catch(error=>{console.log('连接服务器时发生错误!',error);})}else{console.log('表单验证失败');}});

//有端index.html

<!DOCTYPE html>
<html lang="en"><head><meta http-equiv="content-type" content="text/html;charset=UTF-8"><title>用生成器生成表单</title><style type="text/css">#container{width: 1050px;margin: 5px auto;border: 1px solid red;text-align: center;font-size: 16px;padding-top:10px;}.regInput{margin-bottom: 15px;}.regInput label{font-family: Arial, Helvetica, sans-serif;}.regInput input{text-indent: 5px;}.btn1{margin-top: 15px;}</style></head><body><div id="container"></div><script src="formfieldgenerator.js"></script></body>
</html>

后端代码formfieldgenerator.php

<?phpif($_SERVER['REQUEST_METHOD']==='POST')
{$username=$_POST['username'];$pwd=$_POST['pwd'];$email=$_POST['email'];if(isset($username) && isset($pwd) && isset($email)){$data=array('username'=>$username,'pwd'=>$pwd,'email'=>$email);echo json_encode($data);}else{echo '没有';}}else
{echo 'no';
}?>    

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • LambdaQueryWrapper 是 MyBatis-Plus超级利器
  • Telegram mini app 本地开发配置
  • 跟着GPT学习 Kubernetes ,简称 K8s -- Kind(三)
  • redis 过期监听:高效管理数据生命周期
  • 回归预测|基于北方苍鹰优化极端梯度提升树的数据回归预测Matlab程序NGO-XGBoost多特征输入单输出
  • 光伏电站设备设施巡视卡之转变二维码登记卡
  • 计算机毕业设计 毕业季旅游一站式定制服务平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • 使用kubeadm快速部署一套K8S集群
  • 设置虚拟机使用主机以太网而不是WiF连接
  • 普元EOS-低开页面下拉选择控件加载列表数据
  • 修改wls2上的默认用户为root
  • mariadb centos 7 安装
  • 百数功能插件技术解析:审批流程设置与数据填写便捷性探讨
  • 《Programming from the Ground Up》阅读笔记:p95-p102
  • Redis使用详解
  • [nginx文档翻译系列] 控制nginx
  • 【翻译】babel对TC39装饰器草案的实现
  • Angular 响应式表单 基础例子
  • Cumulo 的 ClojureScript 模块已经成型
  • JavaScript 奇技淫巧
  • JavaScript服务器推送技术之 WebSocket
  • Js基础知识(一) - 变量
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Puppeteer:浏览器控制器
  • python_bomb----数据类型总结
  • VuePress 静态网站生成
  • vue的全局变量和全局拦截请求器
  • 程序员最讨厌的9句话,你可有补充?
  • 从0到1:PostCSS 插件开发最佳实践
  • 对超线程几个不同角度的解释
  • 构建工具 - 收藏集 - 掘金
  • 技术胖1-4季视频复习— (看视频笔记)
  • 简单实现一个textarea自适应高度
  • 模型微调
  • 前端学习笔记之观察者模式
  • 如何进阶一名有竞争力的程序员?
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 收藏好这篇,别再只说“数据劫持”了
  • 算法-插入排序
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 新手搭建网站的主要流程
  • 由插件封装引出的一丢丢思考
  • 云大使推广中的常见热门问题
  • 《天龙八部3D》Unity技术方案揭秘
  • elasticsearch-head插件安装
  • gunicorn工作原理
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​ssh免密码登录设置及问题总结
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • #### golang中【堆】的使用及底层 ####
  • #includecmath
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (C++哈希表01)
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程