一直觉得遇到输入框很多,而且都有检查其有效性的,代码很冗余,尤其是每个输入框都写一个点击旁边窗口,搜索出所有可以输入的合法值,选则其一,然后便输入到输入框,如果用户自己输入,还有写一个onblur的事件来检测输入的有效性,然后每个页面可能有类似的输入类别,但是由于不同的页面,也有写一套,这样下来,我发觉我每天都在copy代码,然后每修改一个逻辑,要修改n个程式!写了那么多,终于有点经验,现在整理,仅供参考!
像下图的测试法规:我就是这样来做!
我所有的asp程式都放在asp/文件夹,公用的javascript放在js/文件夹的jsPublic,然后如果是单个页面自己的js,我就写在该asp页面里面!
1.触发事件
我有2个表,有效值类别档FIELDVALIDITY,有效值明细档FIELDVALIDITYDETAIL!这里记录我所有可以检测输入合法值的类别和值等信息。这样不管是哪个输入框,我都是点击查询图标后触发:
<img src="../images/Search.gif" width="21" height="22" align="bottom" style="CURSOR: hand" οnclick="Hlp_ValidityID('txtDALaws','TestingOrdinance');"></td>
<img src="../images/Search.gif" width="21" height="22" align="bottom" style="CURSOR: hand" οnclick="Hlp_ValidityID('txtDALaws','TestingOrdinance');"></td>
Hlp_ValidityID函式的定义是放在jsPublic里面,也就是任何页面都可以调用,代码如下:
function Hlp_ValidityID(objNam,objTyp){ //objNam:對象名稱;objTyp:對象值類型
var Mywin=window.open('Hlp_ValidityID.asp?objNam=' + objNam + '&objTyp=' + objTyp,'_blank','direction=0,scrollbars=1,toolbar=0,menubar=0,resizable=0,status=0,width=500,height=400,left=0,top=0');
if (Mywin.opener==null) Mywin.opener=self;
}
2. 查询窗口
调用时候,只要传入我们要检测的输入objNam:對象名稱,就是输入框的name;objTyp:對象值類型-à就是要检测的输入字段的值的类别,是FIELDVALIDITY表里面记录的ValidityID这个字段的值,是pk字段!
开窗查询的程式是Hlp_ValidityID.asp
<%Option Explicit%>
<!-- #include virtual="/include/adovbs.inc" -->
<!-- #include virtual="/include/DataBase.fun" -->
<!-- #include virtual="/include/Pub_Function.fun" -->
<!-- #include file="../include/Impact_TS_InfoChk.fun" -->
<%
'**********************************************************************
'*AUTHOR: MabelDeng
'*CREATE: 2005/09/19
'*NAME: 撞擊測試申請之新增
'**********************************************************************
%>
<%
dim objTyp '要查詢的字段類型
dim objNam '要寫入字段的名稱
dim Title '要查詢字段的描述
dim strSQL,DBConn
dim Rs,RsH
Set DBConn = Application("DBConn")
objTyp = request.QueryString("objTyp") '要查詢之控件類型
objNam = request.QueryString("objNam") '要塞值之控件名
Title =""
strSQL="select ValidityExp from FIELDVALIDITY where ValidityID='"& objTyp &"'"
set RsH=server.createobject("ADODB.RecordSet")
RsH.open strSQL,DBConn
if not RsH.eof then
set Title = RsH("ValidityExp")
end if
strSQL="select D.ValidityTyp,D.ValidityDesc from FIELDVALIDITY H inner join FIELDVALIDITYDETAIL D " &_
"on H.ValidityID = D.ValidityID where H.ValidityID = '"& objTyp &"'"
set Rs=server.createobject("ADODB.RecordSet")
Rs.open strSQL,DBConn
%>
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=big5">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>[<%=Title%>]</title>
<link rel="stylesheet" href="../CSS/Cert_Test_Style.css" type="text/css">
</HEAD>
<Script Language="javascript">
function RetVal(objNam,ReturnValue){
if (!opener.closed){ //父窗口未關掉,則Refresh
opener.document.all(objNam).value = ReturnValue;
opener.document.all(objNam).focus();
}
self.close();
}
</Script>
<BODY>
<Center>
<Table width="90%" height="67" border="0" cellpadding="1" cellspacing="1" bgcolor="#000000">
<TR align="left">
<TD height="23" colspan="2" bgcolor="#3e86ff"><span class="style3"><%=Title%></span></TD>
</TR>
<TR>
<TD bgcolor="#FFFFFF" height="20">欄位值</TD>
<TD bgcolor="#FFFFFF">欄位描述</TD>
</TR>
<%
if Rs.eof then
Response.Write "<Center><a href='javascript:self.close();'>沒有符合的資料!</a></Center>"
else
do until Rs.eof
%>
<TR>
<TD width="25%" bgcolor="#FFFFFF" height="20"><a href="javascript:RetVal('<%=objNam%>','<%=Rs("ValidityTyp").Value %>');" class="style2"><%=Rs("ValidityTyp").Value%></TD>
<TD width="75%" bgcolor="#FFFFFF"><a href="javascript:RetVal('<%=objNam%>','<%=Rs("ValidityTyp").Value %>');" class="style2"><%=Rs("ValidityDesc").Value%></a></TD>
</TR>
<%
Rs.MoveNext
loop
End If
Rs.Close
set Rs=nothing
%>
</Table>
</Center>
</BODY>
</HTML>
每个asp页面只要检测输入框的有效性的,都include进来(<script language="javascript" src="../JS/jsPublic.js"></script>),并且查询的图标都调用,就可以实现写一套程式,整个系统共用!
4.检测合法值
如果是用户用我们查询出来的输入值,那么肯定是合法的,不用检测,但是如果是自己输入,那就要检测!2种作业方式的值都需要秀出字段值的描述,例如MIS000,代表的是资讯部,我们写入表示MIS000,但是要秀给用户,代表的是资讯部,同时用户也要做修改,所以字段值输入框要有,旁边给出一个秀出字段描述(来自FIELDVALIDITYDETAIL的ValidityDesc)!用户自己输入的就写个onblur事件getFDESC()即可!
<input name="txtDALaws" type="text" οnblur="getFDESC('txtDALaws','TestingOrdinance','txtDALawsDesc');" size="10" <%if DHApplyNo <> "" then%>value="<%=RcSet("DALaws")%>"<%end if%>>
<input name="txtDALawsDesc" type="text" class="readonly" readonly="true" size="10" <%if DHApplyNo <> "" then%> value="<%=getFDESC("TestingOrdinance",RcSet("DALaws"))%>" <%end if%>>
getFDESC()的代码:(也是放在jsPublic里面,任何页面可以调用)
function getFDESC(objNam,objTyp,objDesc){ //objNam:對象名稱;objTyp:對象值類型;objDesc:寫入描述名稱
var objVal;
objVal = document.all(objNam).value;
if (objVal != ''){ //有輸入值才判斷
var URL = 'getFieldValid.asp?objTyp=' + objTyp + '&objVal=' + objVal;
var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlHttp.open("POST",URL,false);
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset:big5")
xmlHttp.send();
var returnValue = xmlHttp.responseText;
if(returnValue =='N'){
document.all(objNam).focus();
alert('請輸入正確的' + objTyp);
}
else{
document.all(objDesc).value=returnValue;
}
}
}
实际查询资料库的字段输入值是否合法的xmlHttp调用的程式getFieldValid.asp
<%Option Explicit%>
<!-- #include virtual="/include/adovbs.inc" -->
<!-- #include virtual="/include/DataBase.fun" -->
<!-- #include virtual="/include/Pub_Function.fun" -->
<!-- #include file="../include/Impact_TS_InfoChk.fun" -->
<%
dim olecodepage
dim DBConn,RcSet,Sql
dim cn
dim AD
dim objTyp,objVal
objTyp = trim(request.QueryString("objTyp"))
objVal = trim(request.QueryString("objVal"))
olecodepage = session.CodePage
session.CodePage = 65001
Set DBConn = Application("DBConn")
Set RcSet = Server.CreateObject("ADODB.Recordset")
Sql = "select D.ValidityDesc from FIELDVALIDITY H inner join FIELDVALIDITYDETAIL D on H.ValidityID = D.ValidityID " &_
"where H.ValidityID = '"& objTyp &"' and ValidityTyp = '"& objVal &"'"
RcSet.Open Sql,DBConn
if not RcSet.eof then
Response.write RcSet("ValidityDesc")
else
Response.write "N"
end if
RcSet.close
set RcSet = nothing
session.CodePage = olecodepage
%>
至此,这个查询帮助,检测有效性,秀出描述的流程已经写完,这样整个系统的可以归类的输入框的值就可以简单修改传入的值来检测用户输入的输入框的。至于要不要输入,这个要放在递交触发事件里面!