`
laorer
  • 浏览: 434449 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

用Javascript校验客户端数据

阅读更多
 
<script language="javascript" src="http://tag.csdn.net/urltag.aspx" type="text/javascript"></script>
<script type="text/javascript">function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>

作者: 雨亦奇

一、准确获取文本框数据的字节长度

也许你要问,在javascript中,利用form.textfield.value.length就可以得到form表单的textfield文本框中输入数据的长度了,难道这个长度不是以字节计的吗?

在详细说明之前,读者不妨先测试如下网页:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML4.01Transitional//EN">
<html>
<head>
<title>长度测试</title>
<meta http-equiv="Content-Type"
content="text/html; charset=gb2312">
</head>
<script>
function strlen(str)
{
 return str.length;
}
function test()
{
 alert("'"+form1.textfield.value+"'的长度等于"
+strlen(form1.textfield.value));
}
</script>
<body>
<form name="form1" method="post" action="">
<p>输入字符串:
<input name="textfield" type="text" value="china中国">
</p>
<p>
 <input type="button" name="Button" value="测试" onclick="test();">
</p>
</form>
</body>
</html>
 

测试的结果如下:

怎么样?“china中国”的长度是7,而不是9(按字节算的话,它的长度应该是9)。为什么会这样?答案是这个长度是以Unicode字符计的长度,一个英文字母是一个Unicode字符,一个汉字也是一个Unicode字符。

实际上我们经常用的并不是这个长度,而是以字节为单位计算的长度。在B/S开发中,我们所用的后台数据库,其字段宽度就是以节字计算的。以字节为单位时,一个英文字母是一个字节,而一个汉字则是两个字节了,二者长度不一样。

由于数据校验不宜在数据库服务器端进行(这样做效率很低),所以在客户端(浏览器端)进行数据校验时,就必须以字节为单位,以避免输入的数据超出字段宽度。为此,必须能获取输入数据的准确的字节长度。

笔者经过一番研究,写了如下javascript函数:

function strlen(str)
{
var len;
var i;
len = 0;
for (i=0;i<str.length;i++)
{
if (str.charCodeAt(i)>255) len+=2; else len++;
}
return len;
}
 

在这个javascript脚本中,strlen函数逐个取str字符串中的Unicode字符,利用charCodeAt获取指定位置的字符的值(为数字形式,可和数字进行比较),因为英文字符的值总在0到255之间,所以我们可以认定,如果该值大于255,就表示是汉字,长度加2,否则长度加1,这样最终可得到这个字符串以字节计的长度,满足了我们的要求。

下面是将原取字符串长度的函数strlen替换为新的strlen后的结果:

二、客户端数据校验的通用解决之道----妙用自定义属性

我们知道,HTML的文本框元素可以使用type,name,value,size,maxlength,style,id等固有属性,但你可曾想到,我们还可以自定义一些属性呢。笔者是在一个极其偶然的机会里发现这个小秘密的,并且没有想到的是,这个小秘密竟然可以帮我们很大的忙----实现客户端数据的通用校验,自此客户端校验工作容易做了,不用再为每个FORM表单劳神又费力地写javascript校验代码了。

请看下面的测试网页univerify_test.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>基于自定义属性的客户端统一检测方法</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<script language="javascript" src="univerify.js"></script>
<body>
<br>
<br>
<center>基于自定义属性的客户端统一检测方法</center>
<form name="form1" method="post" action=""
onsubmit="return verifyAll(form1);">
<center>
<TABLE align="center" border="1" borderColor="#aaeeff"
 cellPadding="1" cellSpacing="0" width="580">
<tr>
<td><img id=img_NAME src="img/space.gif"></td>
<td>姓名:</td>
<td><input type="text" name="NAME" chname="姓名"
size="10" maxlength="10" maxsize="10" nullable="no"
datatype="text" onBlur="verifyInput(this);">
<font color="red">*</font></td>
</tr>
<td><img id=img_AGE src="img/space.gif"></td>
<td>年龄:</td>
<td><input type="text" name="AGE" chname="年龄"
size="3" maxlength="3" maxsize="3" nullable="no"
datatype="number" onBlur="verifyInput(this);">
<font color="red">*</font></td>
<tr>
<td><img id=img_ADDRESS src="img/space.gif"></td>
<td>住址:</td>
<td><input type="text" name="ADDRESS" chname="住址"
size="40" maxlength="100" maxsize="100" nullable="yes"
datatype="text" onBlur="verifyInput(this);"></td>
</tr>
<tr height=48px>
<td colspan=3 align=center><input type="submit"
name="Button" value="检测全部输入并提交" ></td>
</tr>
</table>
</center>
</form>
</html>
 
上述网页的表单form1中有三个文本框,姓名(NAME)、年龄(AGE)和住址(ADDRESS)。笔者为这三个文本框中自行定义了四个新属性,分别是:

1、chname:表示该数据的中文名称,用于校验出错时显示用。

2、maxsize:表示允许输入的最大长度,这个长度是以节字计算的。

3、nullable:表示输入值是否允许为空。为yes时允许为空。

4、datatype:表示输入值的数据类型。这个数据类型用户可以根据需要自行定义,需要注意的是,对于每一个新的数据类型,均需要在下面将要讲述的javascript文件univerify.js中添加相应的校验函数,从而实现统一校验。

三个文本框都对失去焦点事件进行捕获:onBlur="verifyInput(this);"。在失去焦点时用verifyInput校验一下此文本框的值是否合法。

form1表单对onsubmit事件进行了捕获:onsubmit="return verifyAll(this);"。在用户提交表单时,用verifyAll对此表单的元素的值统一进行检测,验证其合法性,保证存入数据库时不出现异常。

上述网页引用的javascript函数库univerify.js内容如下:

/******************************************************/
/* 文件名:univerify.js                               */
/* 功  能:基于自定义属性的统一检测用javascript函数库 */
/* 作  者:纵横软件制作中心雨亦奇(zhsoft88@sohu.com)  */
/******************************************************/
/* 取得字符串的字节长度 */
function strlen(str)
{var i;
var len;
len = 0;
for (i=0;i<str.length;i++)
{
if (str.charCodeAt(i)>255) len+=2; else len++;
}
return len;
}
/* 检测字符串是否为空 */
function isnull(str)
{
var i;
 for (i=0;i<str.length;i++)
{
  if (str.charAt(i)!=' ') return false;
}
 return true;
}
/* 检测字符串是否全为数字 */
function isnumber(str)
{
var number_chars = "1234567890";
var i;
for (i=0;i<str.length;i++)
{
if (number_chars.indexOf(str.charAt(i))==-1) return false;
}
return true;
}
/* 检测指定文本框输入是否合法 */
function verifyInput(input)
{
var image;
var i;
var error = false;
/* 长度校验 */
if (strlen(input.value)>parseInt(input.maxsize))
{
alert(input.chname+"超出最大长度"+input.maxsize);
error = true;
}
else
/* 非空校验 */
if (input.nullable=="no"&&isnull(input.value))
{
alert(input.chname+"不能为空");
error = true;
}
else
{
/* 数据类型校验 */
switch(input.datatype)
{
case "number": if (isnumber(input.value)==false)
{
alert(input.chname+"值应该全为数字");
error = true;
}
break;
/* 在这里可以添加多个自定义数据类型的校验判断 */
/*  case datatype1: ... ; break;        */
/*  case datatype2: ... ; break;        */
/*  ....................................*/
default  : break;
}
}
/* 根据有无错误设置或取消警示标志 */
if (error)
{
image = document.getElementById("img_"+input.name);
image.src="img/warning.gif";
return false;
}
else
{
image = document.getElementById("img_"+input.name);
image.src="img/space.gif";
return true;
}
}
/* 检测指定FORM表单所有应被检测的元素
(那些具有自定义属性的元素)是否合法,此函数用于表单的onsubmit事件 */
function verifyAll(myform)
{
var i;
for (i=0;i<myform.elements.length;i++)
{
 /* 非自定义属性的元素不予理睬 */
if (myform.elements[i].chname+""=="undefined") continue;
/* 校验当前元素 */
if (verifyInput(myform.elements[i])==false)
{
myform.elements[i].focus();
return false;
}
}
return true;
}
 

在univerify.js中,verifyAll用来校验指定表单的数据,它是逐个提取表单中的元素的,不用特别指定表单元素的名字,所以具有通用性。verifyInput是用来实际执行数据校验的函数,如果有新的数据类型datatype需要检测,用户可在此函数中添加,可扩充性好。

下面是浏览univerify_test.html网页的画面:

使用基于自定义属性的客户端统一检测方法,需要做的工作很简单:

1、在网页文件中嵌入统一检测用javascript函数库:<script language="javascript" src="univerify.js"></script>

2、对所用表单添加onsubmit事件处理程序:onsubmit="return verifyAll(this);"。其中的this指定为当前表单对象,勿需提供表单具体名字,极具通用性。

3、对每个需要检测的文本框添加chname,maxsize,nullable和datatype四个自定义属性。如果想在文本框失去焦点时对数据进行一下校验,请添加事件处理程序:onBlur="verifyInput(this);"。

怎么样?使用基于自定义属性的客户端统一检测方法后,不用再为每个表单写类似的检测代码了吧,统一检测足够了。

小结:自定义属性是非常有用的属性,基于自定义属性的客户端数据统一检测方法,在B/S开发中极其有用,使用方便,可扩充性强。相信读者经过实践,自能体会到个中妙处。

 

分享到:
评论

相关推荐

    Web前端开发基础:使用JavaScript进行客户端数据验证.ppt

    顺序结构的应用 分支结构的应用 循环结构的应用 常用系统 函数的应用 自定义函数的应用 综合应用 顺序结构是程序设计中最常用的一种程序结构,是按照语句出现的顺序,从第一条语句开始一步一步逐条执行,直至最后一...

    JavaScript校验设计.zip

    在网页开发中,JavaScript校验设计扮演着至关重要的角色,它能够确保用户输入的数据符合预设的格式和规则,减少服务器端的压力,提高用户体验。本文将深入探讨JavaScript中的数据验证设计与数据获取。 一、...

    动态Web应用中客户端数据校验技术探讨.pdf

    【动态Web应用中客户端数据校验技术】 随着互联网技术的快速发展和电子商务时代的到来...随着前端技术的不断进步,如AJAX的使用,客户端数据校验将更加智能化和实时化,为动态Web应用的稳定性和用户体验带来更多改进。

    基于Java的Web应用程序中数据校验的实现.pdf

    在客户端数据校验中,可以使用JavaScript来实现。在JSP页面中,可以使用JavaScript来检查所有请求的域,如果不符合要求就弹出错误信息。可以把需要使用JavaScript实现校验的所有函数写在validate.jsp中,包括空校验...

    struts2 短路校验(客户端校验)

    客户端校验通常使用JavaScript或HTML5的内置验证功能来实现。这种方式可以提高应用的响应速度,因为用户无需等待服务器响应就能看到错误信息。同时,它减少了服务器的负载,因为只有校验通过的数据才会被发送到...

    安全测试之避开客户端校验

    比如使用javascript来校验长度是否超长,格式是否正确,使用隐藏html表单字段进行数据传送,使用url参数传送数据等等。  但是,这样做存在一个基本的安全缺陷:用户能够完全控制客户端及提交的数据,即避开任何在...

    javascript校验大全

    本文将深入探讨“javascript校验大全”所涵盖的验证技术,包括表单验证、数据类型验证以及特殊格式验证,如邮箱、身份证号等。 1. **表单验证**:在网页交互中,表单是最常见的用户输入接口。JavaScript可以实时...

    Asp.Net MVC之客户端校验

    在Asp.Net MVC框架中,客户端验证是一种增强用户体验的有效手段,它允许在用户提交表单前在浏览器端进行数据验证,避免了不必要的服务器往返请求,从而提高了应用性能。本课程将深入探讨Asp.Net MVC中的客户端验证...

    javascript 常用校验代码

    通过学习和理解这些JavaScript校验代码,开发者可以构建更健壮、更安全的应用程序,减少错误并提供更好的用户体验。同时,了解和掌握这些技术也有助于提升编程能力,适应不断变化的Web开发需求。

    企业动态网站应用程序开发——输入数据实时校验函数及使用方法(Javascript篇).pdf

    企业动态网站应用程序开发——输入数据实时校验函数及使用方法(Javascript篇) 本文主要讲述了企业动态网站应用程序开发中的输入数据实时校验函数及使用方法,以Javascript为例。我们知道,企业信息化是指利用应用...

    javascript常用校验脚本

    JavaScript是一种广泛应用于网页和网络应用的编程语言,它在客户端执行,可以实现丰富的用户交互。在前端开发中,数据验证是必不可少的环节,确保用户输入的数据格式正确、合法,能够有效防止错误信息的提交,提高...

    很好的JavaScript校验框架实例

    学习和使用这样的JavaScript校验框架,可以帮助开发者快速构建健壮的前端验证机制,提升网站的安全性和用户体验。同时,理解其内部机制也能深化对JavaScript和前端开发的理解。通过阅读源代码和实际操作,开发者可以...

    javascript校验密码强度

    JavaScript是一种广泛应用于网页和网络应用开发的脚本语言,它主要负责处理客户端的交互和动态内容。在创建安全的用户登录系统时,密码强度的验证是至关重要的环节。JavaScript可以用来实现在用户输入密码时实时检查...

    WEB信息系统中的数据校验问题.pdf

    客户端校验是使用JavaScript等脚本语言在客户端对数据进行校验的方法。这种方法的优点是速度快,不需要向服务器提交数据,在一定程度上减少了服务器的负载和网络通信量。客户端校验可以根据数据定义的完整性约束条件...

    Struts2 校验器

    校验过程通常分为两个阶段:客户端验证和服务器端验证,以提高用户体验并确保数据安全。 1. **客户端验证**:在用户提交表单之前,客户端验证可以通过JavaScript或者AJAX技术在浏览器端进行,这样可以即时反馈错误...

    Struts2简单数据校验源码 20120417

    - Struts2还提供了与Dojo JavaScript库的集成,可以实现客户端的数据校验,增强用户体验,减少服务器端的压力。 8. **实际应用场景** - 数据校验在用户注册、订单处理、登录验证等场景下非常重要,防止非法数据...

    教你一天玩转JavaScript(二)——完成对注册页面的数据的简单校验

    在JavaScript的世界里,数据校验是网页开发中不可或缺的一部分,特别是在用户注册页面,确保收集到的信息准确无误至关重要。在“教你一天玩转JavaScript(二)——完成对注册页面的数据的简单校验”这个主题中,我们将...

    struts2校验数据

    客户端校验通常通过JavaScript在用户浏览器上执行,可以提供即时反馈,但安全性较低,因为用户可以禁用JavaScript或篡改数据。服务器端校验则是在服务器接收到用户提交的数据后进行,它提供了更高级别的数据保护,但...

    自定义基于jQuery的客户端表单验证工具

    做健壮的可交互的web应用时,离不开表单输入数据的校验工作,不对输入的数据做验证,很难保证程序不出现错误。表单数据验证一般分为客户端验证和服务器端验证。客户端验证是利用Javascript/DOM技术,对表单域输入的...

    ASP.NET MVC框架开发系列课程(18):客户端校验

    在本课程"ASP.NET MVC框架开发系列课程(18):客户端校验"中,我们将深入探讨如何在客户端进行数据验证,以提供更好的用户体验和减少服务器负担。 客户端验证是在用户浏览器端进行的,它允许我们在用户提交表单之前...

Global site tag (gtag.js) - Google Analytics