【jquery】用jquery手写个表单验证插件

背景

  • 这题刷题刷到的,感觉写起来挺有意思。

思路

  • 直接挂到jquery原型上,然后进行调用即可。

代码

  • 我写的这个验证上基本没啥bug了,包括了表单提交和验证后表单按钮的disabled。
  • 我这个各个功能逻辑写的比较分开,如果以后用到有啥问题也方便修改。
  • 就是没写css,css靠个人。
  • 验证写了邮箱,手机号,最大值,最小值,身份证号都是Input标签。
  • 如果需要绑提交按钮的,就传回调函数名字,从window上拿。提交发送请求就自己发挥。
<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title>Document</title>
</head>
<script src="jquery-2.0.3.js"></script>
<body>

	<body>
		<form method="post" action="/22"  id="form">
			<div>
				<label for="email">邮箱:</label>
				<input type="text" name="email" id="email" />
			</div>
			<div>
				<label for="idnumber">身份证号码</label>
				<input type="text" name="idnumber" id="idnumber" />
			</div>
			<div>
				<label for="phonenumber">手机号</label>
				<input type="text" name="phonenumber" id=phonenumber />
			</div>
			<div>
				<label for="maxnumber">最大值</label>
				<input type="text" name="maxnumber" id="maxnumber" />
			</div>
			<div>
				<label for="minnumber">最小值</label>
				<input type="text" name="minnumber" id="minnumber" />
			</div>
			<div>
				<input type="submit" value="提交" id="send" />
			</div>
		</form>
	</body>
	<script>
		jQuery.fn.extend({
			validate: function (option) {
				let that = this
				let rqlist = []
				let subm =false
				let self = {
					required: function (context, name,rqlist,subm) {
						let target = context.find(`input[name=${name}]`)[0]
						let that = this
						if (target) {
							$(target).on("blur keyup", function () {
								let val = $.trim(target.value)
								let res = val === '' ? true : false
								let parent = $(target).parent()
								parent.find(".reqmsg").remove()
								if (res) {
									parent.append(
										'<span style="color:red" class="reqmsg">不能为空!&nbsp;</span>'
									)
									if(subm){
										let sb=context.find(`[type=submit]`)[0]
										$(sb).prop('disabled',true)
									}
								}else{
									//别的监听事件存在,通过异步调用
									setTimeout(() => {
										that._valid(context,rqlist)
									});
								
								}
							})
						}
					},
					email: function (context, name,rqlist,subm) {
						let target = context.find(`input[name=${name}]`)[0]
						let that = this
						if (target) {
							$(target).on("blur keyup", function () {
								let reg = /^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$/
								let val = target.value
								let parent = $(target).parent()
								parent.find('.error').remove()
								if (!reg.test(val)&&val!=='') {
									parent.append(
										'<span style="color:red" class="error">邮箱有误!&nbsp;</span>'
									)
									if(subm){
										let sb=context.find(`[type=submit]`)[0]
										$(sb).prop('disabled',true)
									}
								} else{
									setTimeout(() => {
										that._valid(context,rqlist)
									});
								}
							})
						}
					},
					idNumber:function (context, name,rqlist,subm) {
						let target = context.find(`input[name=${name}]`)[0]
						let that = this
						if (target) {
							$(target).on("blur keyup", function () {
								let reg = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
								let val = target.value
								let parent = $(target).parent()
								parent.find('.error').remove()
								if (!reg.test(val)&&val!=='') {
									parent.append(
										'<span style="color:red" class="error">身份证号有误!&nbsp;</span>'
									)
									if(subm){
										let sb=context.find(`[type=submit]`)[0]
										$(sb).prop('disabled',true)
									}
								}else{
									setTimeout(() => {
										that._valid(context,rqlist)
									});
								}
							})
						}
					},
					phoneNumber: function (context, name,rqlist,subm) {
						let target = context.find(`input[name=${name}]`)[0]
						let that = this
						if (target) {
							$(target).on("blur keyup", function () {
								let reg =/^1(3|4|5|7|8)\d{9}$/
								let val = target.value
								let parent = $(target).parent()
								parent.find('.error').remove()
								if (!reg.test(val)&&val!=='') {
									parent.append(
										'<span style="color:red" class="error">手机号有误!&nbsp;</span>'
									)
									if(subm){
										let sb=context.find(`[type=submit]`)[0]
										$(sb).prop('disabled',true)
									}
								}else{
									setTimeout(() => {
										that._valid(context,rqlist)
									});
								}
							})
						}
					},
					maxNumber: function (context,name,max,rqlist,subm) {
						let target = context.find(`input[name=${name}]`)[0]
						let that = this
						if (target) {
							$(target).on("blur keyup", function () {
								let val = target.value
								let reg = /^(\-|\+){0,1}?\d+$/
								let parent = $(target).parent()
								parent.find('.error').remove()
								if (!reg.test(val)&&val!=='') {
									parent.append(
										`<span style="color:red" class="error">必须是数字!&nbsp;</span>`
									)
									if(subm){
										let sb=context.find(`[type=submit]`)[0]
										$(sb).prop('disabled',true)
									}
								}else if(val>max){
									parent.append(
										`<span style="color:red" class="error">不能超过${max}!&nbsp;</span>`
									)
									if(subm){
										let sb=context.find(`[type=submit]`)[0]
										$(sb).prop('disabled',true)
									}
								}else{
									setTimeout(() => {
										that._valid(context,rqlist)
									});
								}
							})
						}
					},			
					minNumber: function (context,name,min,rqlist,subm) {
						let that = this
						let target = context.find(`input[name=${name}]`)[0]
						if (target) {
							$(target).on("blur keyup", function () {
								let val = target.value
								let reg = /^(\-|\+){0,1}?\d+$/
								let parent = $(target).parent()
								parent.find('.error').remove()
								if (!reg.test(val)&&val!=='') {
									parent.append(
										`<span style="color:red" class="error">必须是数字!&nbsp;</span>`
									)
									if(subm){
										let sb=context.find(`[type=submit]`)[0]
										$(sb).prop('disabled',true)
									}
								}else if(val<min){
									parent.append(
										`<span style="color:red" class="error">不能小于${min}!&nbsp;</span>`
									)
									if(subm){
										let sb=context.find(`[type=submit]`)[0]
										$(sb).prop('disabled',true)
									}
								}else{
									setTimeout(() => {
										that._valid(context,rqlist)
									});
								}
							})
						}
					},
					submit:function(context,name,rqlist){
						let target=context.find(`[type=submit]`)[0]
						//有rq先禁用
						if(rqlist){
							$(target).prop('disabled',true)
						}
						this._submit(context,name)
					},
					_valid:function(context,rqlist){
							//查表格选项,查看是否有验证失败的
							let err = context.find('.error')
							let req = context.find('.reqmsg')
							let data = {}
							let sign = false
							let tmp = context.find('input')
							tmp.each((index)=>{
								if($(tmp[index]).attr("type")!=='submit'){
									data[tmp[index].name]=tmp[index].value
								}
							})
							//如果所有value都是空,说明没动
							let num=0
							for(let key in data){
								if(data[key]===''){
									num++
								} 
							}
							if(Object.keys(data).length===num){
								sign=true
							}
							//如果require没验证,说明没动
							let sign2=false
							rqlist.forEach((key)=>{
								if(data[key]===''){
									sign2=true
								}
							})
							let target=context.find(`[type=submit]`)[0]
							if(err.length||req.length||sign||sign2){
								$(target).prop('disabled',true)
							}else{
								$(target).prop('disabled',false)
							}
					},
					_submit:function(context,name){
						let target=context.find(`[type=submit]`)[0]
						if(target){
							target.addEventListener('click',function(e){
								e.preventDefault()
								window[name]()
							})
						}
					}
				}
				Object.keys(option).forEach((name) => {
					option[name].forEach((key) => {
						if(key==='required')rqlist.push(name)
						if(key==='submit')subm=true
					})
				})
				Object.keys(option).forEach((name)=>{
					option[name].forEach((key)=>{
						if(typeof key ==='object'){
							if(key['maxNumber']){
								self['maxNumber'](that,name,key['maxNumber'],rqlist,subm)
							}
							if(key['minNumber']){
								self['minNumber'](that,name,key['minNumber'],rqlist,subm)
							}
						}else{
							self[key](that, name,rqlist,subm)
						}
					})
				})
			}
		})
		function xxx(){
			console.log('xxxx');
		}
		$("#form").validate({
			//name/fn  //valdate
			email: ["required", "email"],
			idnumber: ["idNumber","required"],
			phonenumber:["phoneNumber"],
			maxnumber:[{"maxNumber":20}],
			minnumber:[{"minNumber":-10}],
			xxx:["submit"]
		})

	</script>

</body>

</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

业火之理

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值