检查一下代码
来源:4-8 编程练习
weixin_慕的地5241954
2019-10-01 03:29:01
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户注册表验证</title>
<style>
body{
margin: 0;
padding: 0;
}
/* 内容区 */
.content{
width: 1200px;
height: 740px;
margin: 100px auto;
}
/* 标题区 */
.title{
width: 100%;
height: 30px;
line-height: 30px;
background-color: #3092d1;
}
.title h2{
margin: 0;
text-indent: 20px;
font-size: 20px;
font-weight: lighter;
color: #fff;
}
/* 注册区 */
.register{
width: 100%;
height: 700px;
background-color: #ededee;
float: left;
/* 浮动是为了紧贴标题 */
}
.register-form{
margin: 100px auto;
width: 800px;
position: relative;
}
/* 这几步微调很关键 */
.register-form table{
margin-left: 150px;
}
.register-form table tr{
height: 50px;
}
.register-form table tr td{
text-indent: 10px;
}
/* 这几步微调很关键 */
.register-form table tr td:first-child{
text-align: right;
}
.register-form table tr td span{
color: red;
}
.register-form table tr td select{
width: 170px;
height: 20px;
}
.submit{
width: 80px;
height: 40px;
margin-top: 50px;
position: absolute;
left: 50%;
margin-left: -80px;
border: 1px solid #000;
border-radius: 5px;
background-color: #2375ba;
color: #fff;
text-align: center;
line-height: 40px;
font-size: 16px;
cursor: pointer;
}
</style>
</head>
<body>
<!-- 内容区 -->
<div class="content">
<!-- 标题区 -->
<div class="title"><h2>用户注册</h2></div>
<!-- 用户注册区 -->
<div class="register">
<!-- 用户注册表 -->
<!-- 这里如果用form标签,会把提交结果马上发送过去,正则验证的显示结果会丢失 -->
<div action="" method="" class="register-form">
<!-- <p><b>用户名:</b><input type="text"><span></span></p>
<p><b>登录密码:</b><input type="password"><span></span></p>
<p><b>确认密码:</b><input type="password"><span></span></p>
<p><b>姓名:</b><input type="text"><span></span></p>
<p><b>性别:</b>
<select>
<option>男</option>
<option>女</option>
</select>
<span></span>
</p>
<p><b>身份证号码:</b><input type="text"><span></span></p>
<p><b>邮箱:</b><input type="text"><span></span></p>
<p><b>手机号码:</b><input type="text"><span></span></p> -->
<table>
<tr>
<td>用户名:</td>
<!-- 用户名是6-20位字母、数字或“_”,字母开头 -->
<td><input type="text" title="^[a-zA-Z][\w_]{5,19}$"></td>
<td><span ></span></td>
</tr>
<tr>
<td>登录密码:</td>
<!-- 密码6-18位,包括数字字母或符号,中间不能有空格 -->
<td><input type="password" title="^\S{6,18}$"></td>
<td><span></span></td>
</tr>
<tr>
<td>确认密码:</td>
<td><input type="password" title=""></td>
<td><span></span></td>
</tr>
<tr>
<td>姓名:</td>
<!-- 两位到四位的中文汉字 -->
<td><input type="text" title="^[\u4e00-\u9fa5]{2,4}$"></td>
<td><span></span></td>
</tr>
<tr>
<td>性别:</td>
<!-- 微调 -->
<td colspan="2">
<select>
<option value="man">男</option>
<option value="woman">女</option>
</select>
</td>
</tr>
<tr>
<td>身份证号码:</td>
<!-- 要求15位或者18位的数字,18位时最后一位可能是x -->
<!-- (?:) ?是非贪婪,:是不获取匹配的值,加()组合在一起是或的简写-->
<td><input type="text" title="^(?:\d{15}|\d{18}|\d{17}x)$"></td>
<td><span></span></td>
</tr>
<tr>
<td>邮箱:</td>
<!-- 邮箱的格式大概分为这么几种,12323@qq.com、lulu_s@open.com、lu_lu_z@qq.com.cn等 -->
<td><input type="text" title="^(?:\w+\.)*\w+@(?:\w+\.)+[a-z]+$"></td>
<td><span></span></td>
</tr>
<tr>
<td>手机号码:</td>
<!-- 验证手机号码 -->
<td><input type="text" title="^1[3458][0-9][\d]{8}$"></td>
<td><span></span></td>
</tr>
</table>
<input type="submit" class="submit">
</div>
</div>
</div>
</body>
<script>
var inputs = document.querySelectorAll('input');
var spans = document.querySelectorAll('span');
var content = [
"6-20位字母、数字或“_”,字母开头",
"6-18位,包括数字字母或符号,中间不能有空格",
"请输入相同的密码",
"真姓名,两位到四位的中文汉字",
"15位或者18位的数字,18位时最后一位可能是x",
"请输入正确的邮箱地址",
"请输入正确的手机号码"
];
var pattern,
sum = 0;
//对每一项input的正则验证,并输出验证结果
inputs[0].onblur = function(){
pattern = new RegExp(inputs[0].title);
// if(pattern.exec(inputs[0].value)){
// spans[0].innerHTML = 'OK';
// }else{
// spans[0].innerHTML = content[0];
// }
pattern.exec(inputs[0].value)?spans[0].innerHTML = 'OK':spans[0].innerHTML = content[0];
};
// console.log(pattern) pattern是全局变量,在函数里面赋值的pattern是局部变量
inputs[1].onblur = function(){
pattern = new RegExp(inputs[1].title);
pattern.exec(inputs[1].value)? spans[1].innerHTML = 'OK': spans[1].innerHTML = content[1];
};
inputs[2].onblur = function(){
inputs[2].value == inputs[1].value?spans[2].innerHTML = 'OK':spans[2].innerHTML = content[2];
};
inputs[3].onblur = function(){
pattern = new RegExp(inputs[3].title);
pattern.exec(inputs[3].value)? spans[3].innerHTML = 'OK':spans[3].innerHTML = content[3];
};
inputs[4].onblur = function(){
pattern = new RegExp(inputs[4].title);
pattern.exec(inputs[4].value)?spans[4].innerHTML = 'OK':spans[4].innerHTML = content[4];
};
inputs[5].onblur = function(){
pattern = new RegExp(inputs[5].title);
pattern.exec(inputs[5].value)?spans[5].innerHTML = 'OK':spans[5].innerHTML = content[5];
};
inputs[6].onblur = function(){
pattern = new RegExp(inputs[6].title);
pattern.exec(inputs[6].value)?spans[6].innerHTML = 'OK':spans[6].innerHTML = content[6];
};
inputs[7].onclick = function(){
for(var i = 0;i < spans.length;i++){
if(spans[i].innerHTML != 'OK'){
spans[i].innerHTML = content[i];
}else{
sum++;
}
}
sum == 7?alert('验证成功'):alert('验证失败');
}
// 对每一项input的正则验证函数封装该怎么写,我下面尝试了两种办法都不行,能教一下吗?
// for(var i = 0;i < inputs.length;i++){
// inputs[i].onblur = function(){
// for(var j = 0;j < inputs.length;j++){
// console.log(j)
// pattern = new RegExp(inputs[j].title);
// pattern.exec(inputs[j].value)?spans[j].innerHTML = 'OK':spans[j].innerHTML = content[j];
// }
// };
// }
// function regExp(elem, idx){
// pattern = new RegExp(inputs[idx].title);
// inputs[idx].onblur = function(){
// for(var i = 0;i < spans.length;i++){
// spans[i].innerHTML = '';
// if(i == idx){
// pattern.test(inputs[idx].value);
// spans[i].innerHTML = 'ok';
// break;
// }else{
// spans[i].innerHTML = content[i];
// }
// }
// }
// }
// for(var i = 0;i < inputs.length;i++){
// regExp(inputs,i);
// }
</script>
</html>1、//console.log(pattern) pattern是全局变量,在函数里面赋值的pattern是局部变量。这里每一项中的pattern = new RegExp(inputs[0].title);赋值后,return pattern;在外面的pattern也是未定义的,为什么return不出去呢?
2、对每一项input的正则验证函数封装该怎么写,我下面尝试了两种办法都不行,能教一下吗?我在代码中有注释,麻烦看一下
1回答
同学,你好。要实现的话有点麻烦,我先给你讲一下,你能听懂的话更好,要是听不懂的话,也没关系,先往后学习,先记住这些。
关于你的第一个问题:
1.首先纠正一个错误,在javascript中,不使用关键字声明的变量会出现变量提升,变量会提升至全局作用域。所以函数内赋值的pattern实际上是对全局变量pattern进行赋值;说大白话就是只要没有用var声明的,都是全局变量。
2.console.log之所以输出未定义,是由于javacript的事件循环机制(Event Loop)造成的。
详细解释:
根据事件循环机制的规定,javacript会先执行所有的同步操作,待同步操作执行完毕之后,才会执行异步队列中的方法。
onblur并非函数声明,而是属于回调方法。js中所有回调均为异步操作。
而console.log是javascript的内置函数,属于同步方法,所以,在console.log输出时,全局变量pattern并未被赋值,自然是未定义的。
如果想要打印全局pattern,可以声明一个函数输出window.pattern,在赋值完成后调用。如:
第二个问题,比较方便的就是修改你的第一种方法,参考下面的代码,里面也有备注:
function print_f (){
console.log(window.pattern)
}
inputs[0].onblur = function(){
pattern = new RegExp(inputs[0].title);
pattern.exec(inputs[0].value)?spans[0].innerHTML = 'OK':spans[0].innerHTML = content[0];
print_f();
};
如果帮助到了你,欢迎采纳!
祝学习愉快!
相似问题