JS表单验证

很多页面都会有表单提交,验证表单数据是否正确,是要把表单提交到服务端,跟数据库进行比对。然而有些简单的事情,其实前端就可以先验证一下,比如字符格式,输入长度等信息,通过JS对表单基本情况进行验证,避免每次都要去请求服务端,提高网页性能。
验证的正则表达式根据自己的需求可以自行修改。
简单的写了四个验证,分别是用户名、密码、手机和邮箱。

  • 以下是html结构
    span里面的提示信息设置了隐藏,不符合规则时显示,符合规则后隐藏
<form>
        <label>
            <b>用户名:</b><input type="text" class="username">
            <span>用户名不符合规则</span>
        </label>
        <label>
            <b>密 码:</b><input type="text" class="password">
            <span>密码不符合规则</span>
        </label>
        <label>
            <b>手机号:</b><input type="text" class="telphone">
            <span>手机号不符合规则</span>
        </label>
        <label>
            <b>邮 箱:</b><input type="text" class="email">
            <span>邮箱不符合规则</span>
        </label>
        <button>登录</button>
    </form>
  • 以下是CSS样式
* {
            margin: 0;
            padding: 0;
        }

        b {
            font-weight: 400;
            width: 80px;
            display: inline-block;
        }

        form {
            width: 500px;
            margin: 100px auto;
            display: flex;
            flex-direction: column;
            border: 1px solid #ccc;
            padding: 20px;
        }

        label {
            margin: 5px;
        }

        input {
            outline: none;
        }

        span {
            color: red;
            display: none;
        }

        button {
            margin-top: 5px;
        }
		// label有error类名时,input的样式
        label.error > input {
            border: 1px solid red;
        }
		// label有error类名时,span的样式
        label.error > span {
            display: inline;
        }
  • 以下是JS代码
    首先获取需要绑定事件的元素,以及把正则组合为一个对象
	var inps = document.querySelectorAll('input')
        // 正则组合对象
        var regObj = {
        	// 用户名规则:6-12位数字字母下划线,开头不能是下划线
            username: /^[0-9a-z]\w{5,11}$/i,
            // 密码规则:6-12位数字字母下划线
            password: /^\w{6,12}$/,
            // 手机号规则:+86开头可有可无,手机号133或者135或者188号段开头
            telphone: /^(\+86)?(133|135|188)\d{8}$/,
            email: /^[0-9a-z]\w{5,11}@(qq|163)\.(com|cn)$/
        }

单个输入框验证。实时验证,每次输入都会检测一次。
验证不通过,给label加类名error,显示提示信息。验证通过,则去掉error类名,提示信息也隐藏。
将处理事件函数提出来单独写,也可以放进监听器里写的,这里为了让代码更清晰。

		// 输入框绑定事件
        inps.forEach(function (item) {
            item.addEventListener('input',handler)
        })
        // 输入框处理事件函数----验证函数
        function handler () {
        	//获取到输入的值
            var text = this.value
            // 输入框的类名与正则的对应成员名取成一样,方便调取
            var reg = regObj[this.className]
            // 验证不通过
            if (!reg.test(text)) {
                // label添加error类名
                this.parentNode.classList.add('error')
                // 给input取消标识符
                //验证不通过把input的自定义属性pass删除(后续表单提交验证会用到)
                this.removeAttribute('pass')
                return
            }
            // 验证通过
            // label移除error类名
            this.parentNodinpute.classList.remove('error')
            // 给input设置标识符
            // 验证通过后给input添加一个自定义属性pass值为1(后续表单提交验证会用到)
            this.setAttribute('pass',1)
        }

点击表单的提交按钮,验证表单中是否所有输入框都符合规则。
前面有给验证通过的input添加自定义属性pass,可以通过检测含有pass属性的input个数,来确认是否可以提交表单到服务器。

var form = document.querySelector('form')
        form.addEventListener('submit',function (e){
        	// 处理事件对象兼容
            e = e || window.event
            // 处理取消表单默认事件兼容
            if(e.preventDefault) {
                e.preventDefault()
            } else {
                e.returnValue = false
            }
			// 自定义一个计数器,记录含有pass属性的input个数
            var count = 0

            inps.forEach(function (item) {
                var res = item.getAttribute('pass')
                // 没有pass属性,即没有通过验证,或者没有书写
                if (!res) {
                	// 他的父亲类名添加error,
                    item.parentNode.classList.add('error')
                    // 否则就是通过了,计数器+1
                } else {
                    count++
                }
            })
			//计数器等于输入框的数量时,才说明每条输入框都通过了验证
			// 不等于即至少有一个不没有通过验证,或者没有写入信息
            if (count !== inps.length) {
                alert('请您输入完整的表单')
                return
            } 

            alert('提交成功')
        })
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
 两个日期比较  /* 用途:检查开始日期是否小于等于结束日期 输入: s:字符串 开始日期 格式:2001-5-4 e:字符串 结束日期 格式:2002-5-4 返回: 如果通过开始日期小于等于结束日期返回true,否则返回false */ function data_compare(s,e) {  var arr=s.split("-");  var starttime=new Date(arr[0],arr[1],arr[2]);... 更多 两个日期比较 信息  为空或全是空格  /* 用途:检查输入字符串是否为空或者全部都是空格 输入:str 返回: 如果全是空返回true,否则返回false */ function isNull(str) { if (str == "") return true; var regu = "^[ ]+$"; ..... 更多 为空或全是空格 信息  判断是否是日期  /* 用途:判断是否是日期 输入:date:日期;匹配的格式: 2010-5-16 返回:如果通过验证返回true,否则返回false */ function isDate(str){ if (isNull(str)) return false;  var r = str.match(/^(\d{4})(-|\/)(\d{1,2})(-|\/)(\d{1,2})$/);  if(r==null)return false;  var d= new Date(r[1], r[3]-1, r[5]); ... 更多 判断是否是日期 信息  字母数字下划线  /* 用途:检查输入字符串是否只由英文字母和数字和下划线组成 输入: s:字符串 返回: 如果通过验证返回true,否则返回false */ function isNumberOr_Letter(s) {//判断是否是数字或字母 var regu = "^[0-9a-zA-Z\_]+$"; var re = new RegExp(regu); if (re.test(s))... 更多 字母数字下划线 信息  字符1以字符串2开始  /* 用途:字符1是否以字符串2开始 输入:str1:字符串;str2:被包含的字符串 返回:如果通过验证返回true,否则返回false */ function isFirstMatch(str1, str2) { var index = str1.indexOf(str2); if (index == 0) return true; return false; } 更多 字符1以字符串2开始 信息  字符1以字符串2结束  /* 用途:字符1是否以字符串2结束 输入:str1:字符串;str2:被包含的字符串 返回:如果通过验证返回true,否则返回false */ function isLastMatch(str1, str2) { var index = str1.lastIndexOf(str2); if (str1.length == index + str2.length) return true; return false; } 更多 字符1以字符串2结束 信息  字符1包含字符串2  /* 用途:字符1是包含字符串2 输入:str1:字符串;str2:被包含的字符串 返回:如果通过验证返回true,否则返回false */ function isMatch(str1, str2) { var index = str1.indexOf(str2); if (index == -1) return false; return true; } 更多 字符1包含字符串2 信息  是否为email  /* 用途:检查输入对象的值是否符合E-Mail格式 输入:str 输入的字符串 返回:如果通过验证返回true,否则返回false */ function isEmail(str) { var myReg = /^[-_A-Za-z0-9]+@([_A-Za-z0-9]+\.)+[A-Za-z0-9]{2,3}$/; if (myReg.test(str)) return true; return false; } 更多 是否为email 信息  是否为手机号码  /* 用途:检查输入手机号码是否正确 输入: s:字符串 返回: 如果通过验证返回true,否则返回false */ function checkMobile(s) { var regu = /^[1][0-9][0-9]{9}$/; var re = new RegExp(regu); if (re.test(s)) .... 更多 是否为手机号码 信息  是否为数字  /* 用途:检查输入字符串是否是数字 输入: str:字符串 返回: 如果通过验证返回true,否则返回false */ function isNumber(str)  {              var reg = /^\d+$/;     if (reg.test(str))... 更多 是否为数字 信息  是否为时间  /* 用途:检查输入字符串是否符合时间格式 输入: time:字符串 返回: 如果通过验证返回true,否则返回false */ function isTime(time){  var regex = /^[0-2]{1}[0-9]{1}:[0-5]{1}[0-9]{1}:[0-5]{1}[0-9]{1}$/;  if(!regex.test(time)){    return false;  } .... 更多 是否为时间 信息  是否为正整数  /* 用途:检查输入字符串是否符合正整数格式 输入: s:字符串 返回: 如果通过验证返回true,否则返回false */ function isNumber(s) { var regu = "^[0-9]+$"; var re = new RegExp(regu); if (s.search(re) != -1) ... 更多 是否为正整数 信息  是否为电话号码  /* 用途:检查输入字符串是否符合国内固话或者传真格式 输入: s:字符串  格式例如:020-87110252 返回: 如果通过验证返回true,否则返回false */ function isTel(s){   var reg=/^((0\d{2,3})-)?(\d{7,8})(-(\d{3,}))?$/;   if(!reg.test(s))... 更多 是否为电话号码 信息  是否为端口号  /* 用途:检查输入对象的值是否符合端口号格式 输入:str 输入的字符串 返回:如果通过验证返回true,否则返回false */ function isPort(str) { return (isNumber(str) && str < 65536); } 更多 是否为端口号 信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值