6.2.4 VBScript过程和函数
前面学习了VBScript的内置函数,利用这些内置函数可以非常方便地完成某些功能。但要完成某些特定功能时,就只能自己编制过程或函数来实现这些功能。
一种是Sub过程,另一种是Function函数。两者的区别在于:Sub过程只是执行程序语句而没有返回值;Function函数可以将执行代码后的结果返回给请求程序。过程和函数的命名规则与变量名命名规则相同。
1. Sub过程
1)声明Sub过程的语法
Sub 过程名(参数1,参数2,……)
……
[exit sub]
End Sub
其中参数是指由调用过程传递的常数、变量或表达式。如果Sub过程无任何参数,Sub过程名后面也必须包含空括号( )。exit sub用于强制跳出过程。
Sub 过程名( )
……
End Sub
2)Sub过程调用的两种方式
方法1:Call 过程名(参数1,参数2,……)
方法2:过程名 参数1,参数2,……
注意:用Call语句调用过程时参数需要带有括号,而用子过程名直接调用时参数不用括号。
3)过程实例
用过程实现求任意两个数的最小公倍数。
--------------------------- minibs.asp ----------------------------
<%
Dim m,n
m=14
n=16
sub minibs(a,b)
if a<=b then max=b
if a>b then max=a
for i=max to a∗b
if I mod a=0 and I mod b=0 then
Response.write I 'I是a和b的最小公倍数
exit for
end if
next
end sub
call minibs(m,n) '第一种调用过程的方法
Response.write “<br>”
minibs m,n '第二种调用过程的方法
%>
--------------------------------------------------------------------
调试该ASP网页程序,两次调用过程,结果都输出:112。
在第5章中已经提到,可以使用JavaScript和层制作菜单。在这一节,我们把编辑菜单写成一个过程,在调用此过程的时候使用不同的参数就可以得到不同的菜单,体会过程的“一次编写,多次调用”的优点。程序清单和执行结果如下。
---------------------------清单6-7 6-7.asp --------------------------
<html>
<head>
<title>使用层和过程技术制作菜单</title>
<script language="javascript">
function disp(obj)
{if (obj.style.visibility=="visible")
{obj.style.visibility="hidden";}
else
{obj.style.visibility="visible";}
}
</script>
<style>
·caiDan{position:absolute;
z-index:2;
visibility: hidden;
background-color: #FFFFFF;
layer-background-color: #FFFFFF;
border: 1px solid #ff0000;
filter: Alpha(Opacity=80);}
</style>
</head>
<body>
<%
Sub menu(title,content)'定义过程
Response.write "<table width=200 border=0 align=center cellpadding=0
cellspacing=0><tr bgcolor=#99CC00><td height=30 style='cursor:hand'
onClick='disp("&title&")'>"&title&"</td> </tr><tr
height=0><td><div id="&title&" class='caiDan' >"&content&"
</div></td> </tr></table>"
End Sub
'四个变量作为两次调用函数的参数
Dim str1,str2,str3,str4
str1="用户控制面板"
str2="<span style= line-height:20px> 更改用户头像<br>更改用户密码<br>个人
资料修改<br>所发表的主题帖子<br>用户发表的回复帖</span>"
str3="风格设置"
str4="<span style= line-height:20px> 默认风格<br>青青河草<br>橘子红了<br>
紫色淡雅</span>"
%>
<!-- 下面两次调用menu过程,等到两个不同的菜单 -->
<table><tr>
<td><%Call menu(str1,str2)%></td>
<td><%Call menu(str3,str4)%></td>
</tr></table>
</body>
</html>
--------------------------------------------------------------------
从这个例子可看出:HTML元素中可以调用JavaScript函数,如<td……onClick='disp("&title&")'……</td>;ASP代码段可以嵌入到HTML代码里,例如,<td><%Call menu(str1,str2)%></td>;HTML代码也可以出现在ASP的输出语句中,例如,Response.write "<table width=200 border=0……>……";一个ASP文件可以含有多个ASP代码段。
本例调试结果如图6-15所示。
图6-15 使用层和过程技术定义菜单
在过程menu中,只有一条语句Response.write,这条语句的内容看起来很复杂,其实很容易理解:
(1)……<div id="&title&"class……把第一个参数title作为放置菜单内容层的id,这样在多次调用过程时,每个层的id都不一样,当然是在菜单的名称不一样的前提下;
(2)……onClick='disp("&title&")'……在鼠标点击菜单标题单元格时就把层变为显示或隐藏;
(3)……'>"&title&"</td> </tr>……把第一个参数作为菜单的标题;
(4)……class='caiDan'>"&content&" </div>……把第二个参数作为菜单的内容。
可以通过浏览图6-15所示的结果,与源文件对照来理解此过程的定义与调用。
2. Function 函数
1)声明函数的语法
Function 函数名([参数1,参数2,……])
……
[exit function]
函数名=函数返回值
End Function
与Sub过程类似,其中“参数1,参数2,……”是指由调用Function传递的常数、变量或表达式。如果Function无任何参数,则 Function函数名后面也必须有空括号( )。“exit function”是强制跳出函数,“函数名=函数返回值”即对函数名赋值,这个值就是函数的返回值,这也是函数与过程不同的地方。
2)函数的调用方法
调用函数时,函数名必须放在赋值语句的右边或表达式中。格式如下:
变量=函数名(参数)
或
Response.write 函数名(参数)
3)使用函数实例
例如,采用函数的方法,求两个数的最大公约数。
----------------------------- maxys.asp -----------------------------
<%
Dim x,y
x=21
y=28
Function maxys(a,b)
If a<b then
small=a
else
small=b
end if
for j=small to 1 step -1
if a mod j=0 and b mod j=0 then
exit for
end if
next
maxys=j ‘j是a和b的最大公约数
end function
Response.write maxys(x,y)
%>
--------------------------------------------------------------------
调试该ASP网页,输出结果为:7。
有时候需要在网页中显示某些特殊字符,例如,<>等与HTML标记符是相同的符号时,浏览器会自动将<>内的内容解释为HTML标记符,因此要用字符实体来替换这些特殊字符。
例如,要在网页上显示"<font color=red>abc</font>"这个字符串时,若直接用Response.write "<font color=red>abc</font>"会得不到想要的结果,得到的是一个红色的"abc",用字符实体来替换这些特殊字符:"<font color=red >abc</font> "。同样,在设计的论坛中,用户的留言含有这些特殊的字符时也不能正常显示,甚至会导致网页不能正常显示。因此,经常要把这些特殊字符替换为字符实体来显示,非常有必要定义一个有这种功能的函数。
下面例子中的函数把一些常用的特殊字符替换为字符实体,也可以看出申明和调用Function函数的一般方法。
---------------------------清单6-8 6-8.asp--------------------------
<HTML>
<HEAD>
<TITLE> 函数的定义和调用 </TITLE>
</HEAD>
<BODY>
<%
Function myReplace(myString)'
myString=Replace(myString,"&","&")'替换&为字符实体&
myString=Replace(myString,"<","<") '替换<为字符实体<
myString=Replace(myString,">",">")'替换>为字符实体>
myString=Replace(myString,chr(13),"<br>")'替换回车符为换行标记<br>
myString=Replace(myString,chr(32)," ")'替换空格符为字符实体
myString=Replace(myString,chr(9)," ")
'替换Tab缩进符为四个空格
myString=Replace(myString,chr(39),"´")'替换单引号为字符实体
´
myString=Replace(myString,chr(34),""")'替换双引号为字符实体
"
myReplace=myString '返回函数值
End Function
Dim str
str="<font color=red>abc</font>"
Response.write str '得到的是一个红色的“abc”
Response.write"<br>"
Response.write myReplace(str)'替换为字符实体,得到正确的结果
%>
</BODY>
</HTML>
--------------------------------------------------------------------
调试结果如图6-16所示。
图6-16 6-8.asp的运行结果
3. 过程和函数的布置
自定义过程和函数可以放置在ASP文件的任意位置上,也可以放在另外一个ASP文件中,然后在需要调用过程或函数的文件中插入HTML语句:<!--#Inlcude file= "filename "-->。利用Include语句不但可以插入函数到别的文件中,还可以把一个文件插入到另一个文件中。例如,6-8.asp可以改写为如下两个asp文件。
---------------------------清单6-9 6-9.asp--------------------------
<%
Function myReplace(myString)'
myString=Replace(myString,"&","&")'替换&为字符实体&
myString=Replace(myString,"<","<") '替换<为字符实体<
myString=Replace(myString,">",">") '替换>为字符实体>
myString=Replace(myString,chr(13),"<br>")'替换回车符为换行标记<br>
myString=Replace(myString,chr(32)," ")'替换空格符为字符实体
myString=Replace(myString,chr(9)," ")
'替换Tab缩进符为四个空格
myString=Replace(myString,chr(39),"´")'替换单引号为字符实体
´
myString=Replace(myString,chr(34),""")'替换双引号为字符实体
"
myReplace=myString '返回函数值
End Function
%>
---------------------------清单6-10 6-10.asp------------------------
<!--#Include file="6-9.asp"-->
<HTML>
<HEAD>
<TITLE> 函数的定义和调用 </TITLE>
</HEAD>
<BODY>
<%
Dim str
str="<font color=red>abc</font>"
Response.write str '得到的是一个红色的“abc”
Response.write"<br>"
Response.write myReplace(str)'替换为字符实体,得到正确的结果
%>
</BODY>
</HTML>
--------------------------------------------------------------------
在这里,6-9.asp和6-10.asp放置在同一个文件夹下面。若这两个文件不是在同一个文件夹下面时,Include语句中"6-9.asp "前面还需要加上6-9.asp的相对路径名。
可以利用这种方法将常用的一些函数和过程都放在同一个文件中,然后在其他文件中包含该函数文件即可,这样函数和过程可以一次定义,却能在多个文件中反复调用。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。