js完美实现表单验证

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title></title>
	<link rel="stylesheet" type="text/css" href="index.css" />
</head>

<body>
	<div id="reg">
		<h2><img src="img/close.png" alt="关闭" class="close" />会员注册</h2>
		<form id="form" action="#" name="reg">
			<dl>
				<dd>用 &nbsp;户 &nbsp;名:<input id="uname" type="text" name="user" class="text" />
					<span id="info_user" class="info info_user">请输入用户名,2~20位,由字母、数字和下划线组成</span>
					<span id="error_user" class="error error_user">输入不合法,请重新输入!</span>
					<span id="succ_user" class="succ succ_user">可用</span>
					<span id="loading" class="loading">正在检测用户名...</span>
				</dd>
				<dd>密 &nbsp; &nbsp; &nbsp; 码:<input id="pwd" type="password" name="pass" class="text" />
					<span id="info_pass" class="info info_pass">
						<p>安全级别:<strong id="s1" class="s s1">■</strong> <strong id="s2" class="s s2">■</strong> <strong
								id="s3" class="s s3">■</strong> <strong id="s4" class="s s4"
								style="font-weight: normal;"></strong></p>
						<p><strong id="q1" style="font-weight: normal;">○</strong> 6-20个字符</p>
						<p><strong id="q2" style="font-weight: normal;">○</strong> 只能包含大小写字母、数字和非空格字符</p>
						<p><strong id="q3" style="font-weight: normal;">○</strong> 大、小写字母、数字、非空字符,2种以上</p>
					</span>
					<span id="error_pass" class="error error_pass">输入不合法,请重新输入!</span>
					<span id="succ_pass" class="succ succ_pass">可用</span>
				</dd>
				<dd>密码确认:<input type="password" name="notpass" class="text" id="pwd2" />
					<span id="info_notpass" class="info info_notpass">请再一次输入密码!</span>
					<span id="error_notpass" class="error error_notpass">密码不一致,请重新输入!</span>
					<span id="succ_notpass" class="succ succ_notpass">可用</span>
				</dd>
				<dd>提 &nbsp; &nbsp; &nbsp; 问:
					<select name="ques">
						<option value="0">----请选择----</option>
						<option value="1">--您最喜欢吃的菜</option>
						<option value="2">--您的狗狗的名字</option>
						<option value="3">--您的出生地</option>
						<option value="4">--您最喜欢的明星</option>
					</select>
					<span class="error error_ques">尚未选择提问,请选择!</span>
				</dd>
				<dd>回 &nbsp; &nbsp; &nbsp; 答:<input type="text" name="ans" class="text" />
					<span class="info info_ans">请输入回答,2~32位!</span>
					<span class="error error_ans">回答不合法,请重新输入!</span>
					<span class="succ succ_ans">可用</span>
				</dd>
				<dd>电子邮件:<input id="email" type="text" name="email" class="text" autocomplete="off" />
					<span id="info_email" class="info info_email">请输入电子邮箱!</span>
					<span id="error_email" class="error error_email">邮箱不合法,请重新输入!</span>
					<span id="succ_email" class="succ succ_email">可用</span>
					<ul id="all_email" class="all_email">
						<li><span class="emailText"></span>@qq.com</li>
						<li><span class="emailText"></span>@163.com</li>
						<li><span class="emailText"></span>@souhu.com</li>
						<li><span class="emailText"></span>@sina.com.cn</li>
						<li><span class="emailText"></span>@gmail.com</li>
						<li><span class="emailText"></span>@yahoo.com.cn</li>
						<li><span class="emailText"></span>@yeah.net</li>
					</ul>
				</dd>
				<dd class="birthday">生 &nbsp; &nbsp; &nbsp; 日:
					<select id="year" name="year">
						<option value="0">-年-</option>
					</select>-
					<select id="month" name="month">
						<option value="0">-月-</option>
					</select>-
					<select id="day" name="day">
						<option value="0">-日-</option>
					</select>
					<span class="error error_birthday">尚未全部选择,请选择!</span>
				</dd>
				<dd style="height: 105px;"><span style="vertical-align: 85px;">备 &nbsp; &nbsp; &nbsp; 注:</span><textarea
						id="tarea" name="ps"></textarea></dd>
				<dd id="okNum" style=" display: block;" class="ps">还能输入<strong id="num" class="num">200</strong>字</dd>
				<dd id="errNum" style=" display: none;" class="ps">已超过<strong id="moreNum" class="num"></strong>字,<span
						id="clear" class="clear">清尾</span></dd>
				<dd style="padding: 0 0 0 65px;"><input id="sub" type="submit" name="sub" class="submit" value="" />
				</dd>
			</dl>
		</form>
	</div>
</body>
</html>
 * 1.用户名验证
 * 		uname获取焦点时规则提示
 * 		失去焦点时,如果不符合验证要求,提示不合法信息
 * 		符合要求提示成功信息
 * 2.密码验证
 * 3.密码强度验证
 * 4.邮箱验证
 * 5.年月日三级联动
 * 6.备注实现
 * 当点击提交按钮,表单验证只要有一个未通过验证,无法提交
<script type="text/javascript">
	
	var form = $id("form");
	var sub = $id("sub");
	var uname = $id("uname");
	var info_user = $id("info_user");
	var error_user = $id("error_user");
	var succ_user = $id("succ_user");
	var loading = $id("loading");
	//表单提交
	var nameFlag = false;
	var pwdFlag = false;
	var emailFlag = false;

	form.onsubmit = function () {
		if (nameFlag == true && pswFlag == true && emailFlag == true) {
			return true;
		} else {
			// alert("验证未通过");
			return false;
		}
	}
	//用户名验证
	uname.onfocus = function () {
		succ_user.style.display = "none";
		error_user.style.display = "none";
		info_user.style.display = "block";
	}
	uname.onblur = function () {
		var reg = /^\w{2,20}$/;
		info_user.style.display = "none";
		if (reg.test(uname.value)) {
			succ_user.style.display = "block";
			nameFlag = true;
		} else {
			error_user.style.display = "block";
			nameFlag = false;
		}
	}
	//密码验证
	var pwd = $id("pwd");
	var info_pass = $id("info_pass");
	var error_pass = $id("error_pass");
	var succ_pass = $id("succ_pass");

	pwd.onfocus = function () {
		succ_pass.style.display = "none";
		error_pass.style.display = "none";
		info_pass.style.display = "block";
	}
	pwd.onblur = function () {
		var reg = /^\S{6,20}$/;
		info_pass.style.display = "none";
		if (reg.test(pwd.value)) {
			succ_pass.style.display = "block";
			nameFlag = true;
		} else {
			error_pass.style.display = "block";
			pwdFlag = false;
		}
	}
	//密码强度验证;
	var s1 = $id("s1");
	var s2 = $id("s2");
	var s3 = $id("s3");
	var s4 = $id("s4");
	var q1 = $id("q1");
	var q2 = $id("q2");
	var q3 = $id("q3");

	pwd.onkeyup = function () {
		if (pwd.value.length <= 20 && pwd.value.length >= 6) {
			q1.innerHTML = "●";
		} else {
			q1.innerHTML = "○";
		}
		if (/^\S+$/.test(pwd.value)) {
			q2.innerHTML = "●";
		} else {
			q2.innerHTML = "○";
		}
		//   字母/[a-zA-Z]/    数字/\d/   非空符号/[^0-9a-zA-Z ]/
		if ((pwd.value.search(/\d/) != -1 && pwd.value.search(/[^0-9a-zA-Z ]/) != -1) || (pwd.value.search(/[^0-9a-zA-Z ]/) != -1 && pwd.value.search(/[a-zA-Z]/) != -1) || (pwd.value.search(/\d/) != -1 && pwd.value.search(/[a-zA-Z]/) != -1)) {
			q3.innerHTML = "●";
		} else {
			q3.innerHTML = "○";
		}
		if (pwd.value.length < 6) {
			s4.innerHTML = "";
		}
		if (pwd.value.length >= 6) {
			s1.style.color = "black";
			s4.innerHTML = " 初级";
		} else {
			s1.style.color = "#ccc";
		}
		if (pwd.value.length >= 10) {
			s2.style.color = "black";
			s4.innerHTML = " 中级";
		} else {
			s2.style.color = "#ccc";
		}
		if (pwd.value.length >= 15) {
			s3.style.color = "black";
			s4.innerHTML = " 高级";
		} else {
			s3.style.color = "#ccc";
		}
	}
	//密码确认
	var pwd2 = $id("pwd2");
	var info_notpass = $id("info_notpass");
	var error_notpass = $id("error_notpass");
	var succ_notpass = $id("succ_notpass");

	pwd2.onfocus = function () {
		succ_notpass.style.display = "none";
		error_notpass.style.display = "none";
		info_notpass.style.display = "block";
	}
	pwd2.onblur = function () {
		info_notpass.style.display = "none";
		if (pwd2.value == pwd.value) {
			succ_notpass.style.display = "block";
			pwdFlag = true;
		} else {
			error_notpass.style.display = "block";
			pwdFlag = false;
		}
	}
	//邮箱
	var email = $id("email");
	var info_email = $id("info_email");
	var error_email = $id("error_email");
	var succ_email = $id("succ_email");
	var all_email = $id("all_email");
	var all_email_li = all_email.children;
	var emailText = document.getElementsByClassName("emailText");
	var index = -1;
	//邮箱补全
	email.onkeyup = function (eve) {
		var e = eve || event;
		var code = e.keyCode || e.which || e.charCode;

		all_email.style.display = "block";
		for (var i = 0; i < emailText.length; i++) {
			emailText[i].innerHTML = this.value;
		}
		for (var i = 0; i < all_email_li.length; i++) {
			all_email_li[i].style.background = "white";
		}
		if (code === 13) {
			email.value = all_email_li[index].innerText;
			document.onclick();
			email.onblur();
		}
		if (code === 38) {
			index--;
			if (index == -1) {
				index = 6;
			}
			all_email_li[index].style.background = "#ccc";
		}
		if (code === 40) {
			index++;
			if (index == 7) {
				index = 0;
			}
			all_email_li[index].style.background = "#ccc";
		}

	}
	all_email.onmousemove = function (eve) {
		var e = eve || event;
		var target = e.target || e.srcElement;
		for (var i = 0; i < all_email_li.length; i++) {
			all_email_li[i].style.background = "white";
		}
		if (target.nodeName === "LI") {
			for (var i = 0; i < all_email_li.length; i++) {
				all_email_li[i].style.background = "white";
			}
			target.style.background = "#ccc";
			target.onclick = function () {
				email.value = target.innerText;
				all_email.style.display = "none";
			}
		}
	}
	document.onclick = function () {
		all_email.style.display = "none";
	}
	//邮箱验证
	email.onfocus = function () {
		succ_email.style.display = "none";
		error_email.style.display = "none";
		info_email.style.display = "block";

	}
	email.onblur = function () {

		var reg = /^\w{3,20}@[0-9a-zA-Z]{2,6}(\.[a-zA-Z]{2,3}){1,2}$/
		info_email.style.display = "none";
		if (reg.test(email.value)) {
			succ_email.style.display = "block";
			emailFlag = true;
		} else {
			error_email.style.display = "block";
			emailFlag = false;
		}
	}
	// 日历
	function scjd(p) {//删除p所有子元素节点,剩第一个
		for (var i = p.children.length-1; i>0; i--) {
			if (p.children.length > 1) {
				p.removeChild(p.lastElementChild);
			}
		}
	}
	function runnian(num) {//判断闰年
		if (num % 4 == 0 && num % 100 != 0 || num % 400 == 0) { return true } else { return false }
	};
	var year = $id("year");
	var month = $id("month");
	var day = $id("day");

	for (var i = 2020; i > 1900; i--) {
		year.innerHTML += '<option value="' + i + '">' + i + '</option>';
	}
	year.onchange = function () {
		scjd(month);
		for (var i = 1; i < 13; i++) {
			month.innerHTML += '<option value="' + i + '">' + i + '</option>';
		}
	}
	month.onchange = function () {
		if (year.value != 0 && month.value != 0) {
			if (month.value == 1 || month.value == 3 || month.value == 5 || month.value == 7 || month.value == 8 || month.value == 10 || month.value == 12) {
				scjd(day);
				for (var i = 1; i < 32; i++) {
					day.innerHTML += '<option value="' + i + '">' + i + '</option>';
				}
			}
			if (month.value == 4 || month.value == 6 || month.value == 9 || month.value == 11) {
				scjd(day);
				for (var i = 1; i < 31; i++) {
					day.innerHTML += '<option value="' + i + '">' + i + '</option>';
				}
			}
			if (month.value == 2) {
				if (runnian(year.value)) {
					scjd(day);
					for (var i = 1; i < 30; i++) {
						day.innerHTML += '<option value="' + i + '">' + i + '</option>';
					}
				} else {
					scjd(day);
					for (var i = 1; i < 29; i++) {
						day.innerHTML += '<option value="' + i + '">' + i + '</option>';
					}
				}
			}
		}
	}
	//备注
	var tarea = $id("tarea");
	var okNum = $id("okNum");
	var errNum = $id("errNum");
	var num = $id("num");
	var moreNum = $id("moreNum");
	var clear = $id("clear");
	tarea.onkeyup = function () {
		if (tarea.value.length <= 200) {
			num.innerHTML = 200 - tarea.value.length;
			okNum.style.display = "block";
			errNum.style.display = "none";
			clear.style.display = "none";
		}
		if (tarea.value.length > 200) {
			okNum.style.display = "none";
			errNum.style.display = "block";
			clear.style.display = "block";
			moreNum.innerHTML = tarea.value.length - 200;
		}
	}
	clear.onclick = function () {
		tarea.value = tarea.value.substring(0, 200);
		tarea.onkeydown();
	}
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值