<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style>
			* {
				margin: 0;
				padding: 0;
				font-size: 18px;
			}
			#login label {
				display: inline-block;
				width: 150px;
				text-align: right;
				margin-right: 20px;
			}
			.formitem {
				margin: 20px 0;
			}
			.hint {
				display: inline-block;
				width: 320px;
				font-size: 14px;
				margin-left: 10px;
			}
			.correct {
				color: green;
			}
			.incorrect {
				color: red;
			}
			#login input[type="submit"] {
				display: inline-block;
				width: 120px;
				height: 30px;
				background-color: darkred;
				color: white;
				font-size: 20px;
				line-height: 30px;
				border: none;
				cursor: pointer;
				margin-left: 200px;
			}
		</style>
	</head>
	<body>
		<form id="login" action="" method="post">
			<div class="formitem">
				<label for="username">用户名: </label>
				<input type="text" id="username" name="username">
				<span id="uidHint" class="hint"></span>
			</div>
			<div class="formitem">
				<label for="password">密码: </label>
				<input type="password" id="password" name="password">
				<span id="pwdHint" class="hint"></span>
			</div>
			<div class="formitem">
				<label for="repassword">确认密码: </label>
				<input type="password" id="repassword">
				<span id="rePwdHint" class="hint"></span>
			</div>
			<div class="formitem">
				<label for="tel">手机号: </label>
				<input type="text" id="tel" name="tel">
				<span id="telHint" class="hint"></span>
			</div>
			<div class="formitem">
				<label for="code">验证码: </label>
				<input type="text" id="code" name="code" size="4">
				<input type="button" value="获取验证码">
			</div>
			<div class="formitem">
				<input type="submit" value="立即开通">
			</div>
			<div class="formitem">
				<label for="agreement"></label>
				<input type="checkbox" id="agreement">
				<span class="hint">我同意<a href="#">《XYZ服务协议》</a></span>
			</div>
		</form>
		<script src="js/mylib.js" ></script>
		<script>	
			(function() {
				// 使用正则表达式的字面量语法创建正则表达式对象
				var uidRegEx = /^\w{6,20}$/;
				var pwdRegEx = /^.{8,20}$/;
				var telRegEx = /^1[345789]\d{9}$/;
				var uid = $('username');
				function checkUsername() {
					var uidHint = $('uidHint');
					var username = uid.value.trim();
					if (uidRegEx.test(username)) {
						uidHint.textContent = '√';
						uidHint.className = 'hint correct';
						return true;
					} else {
						uidHint.textContent = '用户名由字母数字下划线构成且长度为6-20个字符';
						uidHint.className = 'hint incorrect';
						return false;
					}
				}
				handleEvent(uid, 'blur', checkUsername);
				var pwd = $('password');
				function checkPassword() {
					var pwdHint = $('pwdHint');
					var password = pwd.value;
					if (pwdRegEx.test(password)) {
						pwdHint.textContent = '√';
						pwdHint.className = 'hint correct';
						return true;
					} else {
						pwdHint.textContent = '密码长度为8-20个字符';
						pwdHint.className = 'hint incorrect';
						return false;
					}
				}
				handleEvent(pwd, 'blur', checkPassword);
				var rePwd = $('repassword');
				function checkRepassword() {
					var rePwdHint = $('rePwdHint');
					var password = pwd.value;
					var repassword = rePwd.value;
					if (repassword.length == 0) {
						rePwdHint.textContent = '确认密码不能为空';
						rePwdHint.className = 'hint incorrect';
						return false;
					}
					if (repassword == password) {
						rePwdHint.textContent = '√';
						rePwdHint.className = 'hint correct';
						return true;
					} else {
						rePwdHint.textContent = '密码和确认密码不一致';
						rePwdHint.className = 'hint incorrect';
						return false;
					}
				}
				handleEvent(rePwd, 'blur', checkRepassword);
				var telInput = $('tel');
				function checkTel() {
					var telHint = $('telHint');
					var tel = telInput.value;
					if (telRegEx.test(tel)) {
						telHint.textContent = '√';
						telHint.className = 'hint correct';
						return true;
					} else {
						telHint.textContent = '请输入有效的手机号';
						telHint.className = 'hint incorrect';
						return false;
					}
				}
				handleEvent(telInput, 'blur', checkTel);
				var form = $('login') || document.forms[0];
				// 给表单对象绑定表单提交事件
				handleEvent(form, 'submit', function(evt) {
					evt = evt || window.event;
					// 阻止表单提交等到验证通过了之后手动提交表单
					evt.preventDefault();
					if (!$('agreement').checked) {
						alert('请先选中同意《XYZ服务协议》');
						return ;
					}
					// 请注意&&和&之间区别 前者有短路效果后者没有
					if (checkUsername() & checkPassword() &
						checkRepassword() & checkTel()) {
						var target = evt.target || evt.srcElement;
						// 如果所有表单数据验证都通过了就提交表单
						target.submit();
					}
				});
			}());
		</script>
	</body>
</html>