对于Web前台编程,使用JavaScript从表单form中提取用户输入的信息及验证这些信息是一项日常任务,表单一般多包含文本框,单选框,下拉列表框,复选框,文本域等基本元素,如下所示:
下面是该页面的HTML代码:
<html>
<head>
<title>表单控件数据取得及验证完整实例</title>
</head>
<body>
<div>
<table border="1" class="holder" cellspacing="0" width="100%" height="20">
<caption>雇员名单</caption>
<tbody id="personList">
<TR>
<TH>姓名</TH>
<TH>性别</TH>
<TH>籍贯</TH>
<TH>职位</TH>
<TH>简介</TH>
</TR>
</tbody>
</table>
</div>
<hr/>
<div>
<div><font color=red><span id="errMsg"></span></font></div>
姓名:<input type="text" name="name"/><br/>
性别:<input type="radio" name="sex" value="男" checked/>男/<input type="radio" name="sex" value="女"/>女<br/>
籍贯:<select name="nativePlace">
<option value="辽宁" >辽宁</option>
<option value="北京" >北京</option>
<option value="上海" >上海</option>
<option value="湖南" selected>湖南</option>
</select><br/>
职位:<INPUT TYPE="checkbox" NAME="title" value="程序员">程序员</input>
<INPUT TYPE="checkbox" NAME="title" value="高程">高程</input>
<INPUT TYPE="checkbox" NAME="title" value="TL">TL</input>
<INPUT TYPE="checkbox" NAME="title" value="PL">PL</input>
<INPUT TYPE="checkbox" NAME="title" value="GM">GM</input><br/>
简介:<textarea name="intro" rows="10" cols="40"></textarea><br/>
<input type="button" name="btn" value="提交"/><br/>
</div>
</body>
</html>
表单信息提取对于文本框,文本域和下拉列表框并不麻烦,统一使用
$(id).value即可,主要的麻烦在于单选框,复选框的信息提取,如果我们将其单选框,复选框类化,将复杂的信息提取过程隐藏在函数内部,而后调用之则可大大减少重复劳动,取得一劳永逸之功效。
下面请看使用JS类化单选框,复选框的代码:
/********************************************
* 单选框类构造函数
*********************************************/
function RadioButton(name){
this.name=name;
}
/********************************************
* 单选框类函数,用于取得用户的选择项
*********************************************/
RadioButton.prototype.getSelectedValue=function(){
var arr=document.getElementsByTagName("input");
for(var i=0;i<arr.length;i++){
if(arr[i].name==this.name && arr[i].checked){
return arr[i].value;
}
}
return null;
}
/***************************************************
* 复选框类构造函数
****************************************************/
function CheckBoxButton(name){
this.name=name;
}
/***************************************************
* 复选框类函数,得到复选框的选择项,
* 返回值为用户选中的数组,返回空表示用户未选中选项
****************************************************/
CheckBoxButton.prototype.getSelectedValues=function(){
var arr=document.getElementsByTagName("input");
var selectedArr=new Array;
var index=0;
for(var i=0;i<arr.length;i++){
if(arr[i].name==this.name && arr[i].checked){
selectedArr[index++]=arr[i].value;
}
}
return selectedArr;
}
有了两个类的帮助,提取单选框和复选框信息的复杂过程就被隐藏在了类内部,类的客户程序员只要知道这个类及其相关函数就可以了。
下面是从表单中提取信息及验证过程的JavaScript代码,信息整体也被类化了:
/*********************************************************
* 用以缩短常用的document.getElementById
**********************************************************/
function $(id){
return document.getElementById(id);
}
/*********************************************************
* 在窗口载入时调用
**********************************************************/
window.onload=function(){
$("btn").onclick=function(){
/*创建雇员类的实例*/
var emp=new Employee(
$("name").value,
new RadioButton("sex").getSelectedValue(),
$("nativePlace").value,
new CheckBoxButton("title").getSelectedValues(),
$("intro").value
);
/*判断这个实例的合法性,如果合法则添加到表格中,不合法则显示错误信息提示用户*/
if(emp.isValid()==true){
$("personList").appendChild(emp.getInfoLine());
$("name").value="";
$("intro").value="";
$("errMsg").innerHTML="";
}
else{
$("errMsg").innerHTML=emp.errMsg;
}
}
}
var sn=0;
/*********************************************************
* 雇员类的构造函数
**********************************************************/
function Employee(name,sex,nativePlace,titles,intro){
this.name=name;
this.sex=sex;
this.nativePlace=nativePlace;
this.title="";
for(var i=0;i<titles.length;i++){
this.title+=titles[i]+",";
}
this.intro=intro;
this.errMsg="";
}
/*********************************************************
* 雇员类的函数,用以从属性中组合成一个表格行
**********************************************************/
Employee.prototype.getInfoLine=function(){
var row=document.createElement("tr");
row.setAttribute("height",20);
var cell1=document.createElement("td");
cell1.appendChild(document.createTextNode(this.name));
row.appendChild(cell1);
var cell2=document.createElement("td");
cell2.appendChild(document.createTextNode(this.sex));
row.appendChild(cell2);
var cell3=document.createElement("td");
cell3.appendChild(document.createTextNode(this.nativePlace));
row.appendChild(cell3);
var cell4=document.createElement("td");
cell4.appendChild(document.createTextNode(this.title));
row.appendChild(cell4);
var cell5=document.createElement("td");
cell5.appendChild(document.createTextNode(this.intro));
row.appendChild(cell5);
return row;
}
/*********************************************************
* 雇员类的函数,用以判断属性是否合法
**********************************************************/
Employee.prototype.isValid=function(){
var name=this.name;
if(name==""){
this.errMsg="姓名不能为空";
return false;
}
var titles=this.titles;
if(titles==""){
this.errMsg="职称至少要选择一项";
return false;
}
return true;
}
全部网页代码如下:
<html>
<head>
<title>表单控件数据取得及验证完整实例</title>
</head>
<body>
<div>
<table border="1" class="holder" cellspacing="0" width="100%" height="20">
<caption>雇员名单</caption>
<tbody id="personList">
<TR>
<TH>姓名</TH>
<TH>性别</TH>
<TH>籍贯</TH>
<TH>职位</TH>
<TH>简介</TH>
</TR>
</tbody>
</table>
</div>
<hr/>
<div>
<div><font color=red><span id="errMsg"></span></font></div>
姓名:<input type="text" name="name"/><br/>
性别:<input type="radio" name="sex" value="男" checked/>男/<input type="radio" name="sex" value="女"/>女<br/>
籍贯:<select name="nativePlace">
<option value="辽宁" >辽宁</option>
<option value="北京" >北京</option>
<option value="上海" >上海</option>
<option value="湖南" selected>湖南</option>
</select><br/>
职位:<INPUT TYPE="checkbox" NAME="title" value="程序员">程序员</input>
<INPUT TYPE="checkbox" NAME="title" value="高程">高程</input>
<INPUT TYPE="checkbox" NAME="title" value="TL">TL</input>
<INPUT TYPE="checkbox" NAME="title" value="PL">PL</input>
<INPUT TYPE="checkbox" NAME="title" value="GM">GM</input><br/>
简介:<textarea name="intro" rows="10" cols="40"></textarea><br/>
<input type="button" name="btn" value="提交"/><br/>
</div>
</body>
</html>
<script language="javascript">
<!--
/*********************************************************
* 用以缩短常用的document.getElementById
**********************************************************/
function $(id){
return document.getElementById(id);
}
/*********************************************************
* 在窗口载入时调用
**********************************************************/
window.onload=function(){
$("btn").onclick=function(){
/*创建雇员类的实例*/
var emp=new Employee(
$("name").value,
new RadioButton("sex").getSelectedValue(),
$("nativePlace").value,
new CheckBoxButton("title").getSelectedValues(),
$("intro").value
);
/*判断这个实例的合法性,如果合法则添加到表格中,不合法则显示错误信息提示用户*/
if(emp.isValid()==true){
$("personList").appendChild(emp.getInfoLine());
$("name").value="";
$("intro").value="";
$("errMsg").innerHTML="";
}
else{
$("errMsg").innerHTML=emp.errMsg;
}
}
}
var sn=0;
/*********************************************************
* 雇员类的构造函数
**********************************************************/
function Employee(name,sex,nativePlace,titles,intro){
this.name=name;
this.sex=sex;
this.nativePlace=nativePlace;
this.title="";
for(var i=0;i<titles.length;i++){
this.title+=titles[i]+",";
}
this.intro=intro;
this.errMsg="";
}
/*********************************************************
* 雇员类的函数,用以从属性中组合成一个表格行
**********************************************************/
Employee.prototype.getInfoLine=function(){
var row=document.createElement("tr");
row.setAttribute("height",20);
var cell1=document.createElement("td");
cell1.appendChild(document.createTextNode(this.name));
row.appendChild(cell1);
var cell2=document.createElement("td");
cell2.appendChild(document.createTextNode(this.sex));
row.appendChild(cell2);
var cell3=document.createElement("td");
cell3.appendChild(document.createTextNode(this.nativePlace));
row.appendChild(cell3);
var cell4=document.createElement("td");
cell4.appendChild(document.createTextNode(this.title));
row.appendChild(cell4);
var cell5=document.createElement("td");
cell5.appendChild(document.createTextNode(this.intro));
row.appendChild(cell5);
return row;
}
/*********************************************************
* 雇员类的函数,用以判断属性是否合法
**********************************************************/
Employee.prototype.isValid=function(){
var name=this.name;
if(name==""){
this.errMsg="姓名不能为空";
return false;
}
var titles=this.titles;
if(titles==""){
this.errMsg="职称至少要选择一项";
return false;
}
return true;
}
/********************************************
* 单选框类构造函数
*********************************************/
function RadioButton(name){
this.name=name;
}
/********************************************
* 单选框类函数,用于取得用户的选择项
*********************************************/
RadioButton.prototype.getSelectedValue=function(){
var arr=document.getElementsByTagName("input");
for(var i=0;i<arr.length;i++){
if(arr[i].name==this.name && arr[i].checked){
return arr[i].value;
}
}
return null;
}
/***************************************************
* 复选框类构造函数
****************************************************/
function CheckBoxButton(name){
this.name=name;
}
/***************************************************
* 复选框类函数,得到复选框的选择项,
* 返回值为用户选中的数组,返回空表示用户未选中选项
****************************************************/
CheckBoxButton.prototype.getSelectedValues=function(){
var arr=document.getElementsByTagName("input");
var selectedArr=new Array;
var index=0;
for(var i=0;i<arr.length;i++){
if(arr[i].name==this.name && arr[i].checked){
selectedArr[index++]=arr[i].value;
}
}
return selectedArr;
}
//-->
</script>