178 lines
4.9 KiB
HTML
178 lines
4.9 KiB
HTML
|
<!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>
|