VBScript入门
VBScript是在HTML文件中使用的一种VB脚本语言,它是VB的一个子集,可以实现部分VB的功能,从而使HTML语言得到大大的扩展。如果你学习过VB的话,那么VBScript对你来说只是小菜一碟,你只要记住哪些语法命令在“VBScript”中不能使用就行了,而不必费心去记哪些命令可以使用。但是如果你没学过VB,也不要紧,因为它只不过是VB的一个子集,所要学的东西比VB要相对少一些,我保证,你可以很快学会。
我先来说一下本文的特点:主要是面向初学者,我所介绍的也没有将VBScript全包括,只是其中一些比较简单又比较常用的内容。
在学习VBScript之前,我们必须来看一下HTML语言。由于VBScript是建立在HTML这个大的框架的基础之上的,如果没有HTML的支持,那么VBScript便无处安置了。
HTML是一门非常容易的语言,因此当你看到那么多漂亮的网页的时候,千万不要以为它是多么的难学。它没有任何分支及循环语句,它所做的只是告诉浏览器要怎样显示它所指定的内容。现在有很多网页制作工具,如Frontpage等,它们大多可以完成你的多数的工作,甚至于即使你完成不懂HTML,也可以制作出相当水准的网页。就象有人所说的那样,“ForntPage”是用来制作网页的,而学习HTML语言则是为了更好地修改网页的。
在HTML语言中有一个概念是“标志词”,请先看一个最最简单的例子:
<HTML>
<HEAD>
<TITLE>于爱武的个人主页</TITLE>
</HEAD>
<BODY>
</BODY>
</HTML>
在这个例子中,如<HTML>、<HEAD>等这些被“<”、“>”括在中间的称为标志词。还有一点就是标志词一般(个别的除外)都是成对出现的,如<HEAD>和</HEAD>,它的作用是强调一个段落的开始和结束,即强调的是整体概念。下面我们来分析一下上面的例子:
<HTML>和</HTML>总是位于程序的开始和结尾处,用来表示程序的开始和结束,是必不可少的一部分;
<HEAD>和</HEAD>表示程序的头部,如标题等一些信息便要在头部中进行设置;
<TITLE>和</TITLE>用来设置程序的标题,你所设置的标题将会出现在浏览器的标题栏中。例如我们如果设置了标题为“于爱武的个人主页”,那么在浏览器的标题栏中就会显示“于爱武的个人主页-Microsoft Internet Explorer”(以后如果不是特殊说明,均以IE4为浏览器进行试验)。
<BODY>和</BODY>是程序的主体部分,各种图形,文字的输入均可在此进行。
如果你使用了FrontPage,那么上述的工作将全部由FrontPage 来替你完成,而不用你写一句代码。
要在程序中书写文字,可以用<P>和</P>标志词。我们如果在上例的<HEAD>和</HEAD>加入<P>欢迎光临于爱武的个人主页</P>,那么当用浏览器打开程序时,就会在窗体上出现“欢迎光临于爱武的个人主页”字样。
HTML的强大的生命力还在于它的“超连接”功能。我们经常可以在网上见到,当鼠标移至某个图形或某串文字时,鼠标图形会变成一只小手,点下鼠标时,就会打开相应的连接,这就是超连接。它的实现也不难,看看下例就明白了。
<a href="http://yuaiwu.163.net">于爱武的个人主页</a>,其中<a>和</a>可以理解为超连接的标志词,在a后面紧跟的"href=…"表示超连接的地址,而“于爱武的个人主页”表示在窗体上将显示的内容。执行本例后,将在窗体上显示“于爱武的个人主页”,点击后将连接到http://yuaiwu.163.net。
再看下例:<a href="mailto:yuaiwu@163.net">写信给我</a>,其中的mailto表示此超连接为指向一个信箱,即点后可以给yuaiwu@163.net发信。
如果我们要制作文件下载功能,更简单了,只要把超连接指到某一文件就行了,就如下例所示:
<a href = "sample.zip">下载</a> 这样,当我们点击“下载”时,就会把“sample.zip”下载了。
还有最重要的一点就是图像问题。怎么样才能给一个页面加上一个漂亮的背景图片呢?这就要在<BODY>和</BODY>中指定,如<body background="images/wb02102_.gif">,说明了在当前目录的images的子目录下的wb02102_.gif文件将作为该网页的背景图片。使用背景图片应该注意的就是背景的选择应与前台内容相协调,不应有喧宾夺主的感觉,也不应太刺眼,给人反感,还有就是图片尺寸不应太大,如果让人花上个把小时去等待一个背景,那会让人讨厌的。
如果要在窗体上放置一个图片,那么可以直接写成“img src=" wb02102_.gif"”就可以了。
我在此并不想鼓吹VBScript的作用是多么多么的强大,我只想说VBScript确实是一门即简单又富于创造性的语言。我主张学习VBScript这类语言要一边上机一边学习,因为它属于“所见即所得”一类,因此上机可以大大加深你对它的印象。下面我就再举一个非常小的例子,让它来带你进入VBScript的世界。
<HTML>
<HEAD>
<TITLE>于爱武的个人主页</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE="VBSCRIPT">
<!--
MSGBOX "欢迎来到于爱武的个人主页"
-->
</SCRIPT>
</BODY>
</HTML>
先看一下程序的执行结果:出现一个对话框,上面显示一个欢迎信息:"欢迎来到于爱武的个人主页"。下面再来分析一下程序代码:
<SCRIPT LANGUAGE="VBSCRIPT">代表VBScript脚本语言的开始,而</SCRIPT>则是表示VBScript的结束。在这其中放置的代码,即为VBScript语言。还有一点就是在<SCRIPT LANGUAGE="VBSCRIPT">的下面有一行<!,而在</SCRIPT>的上面有一行“-->”,这两个符号相对应,是注释的意思。之所以要将源代码都注释掉,是因为如果有某些浏览器不支持VBScript的话,可以仅仅把它当作注释,而不会对程序造成什么影响。当然,像IE这样支持VBScript的浏览器则会自动执行它的,而不必担心它是注释内容。“MSGBOX”是一个消息框,它后面所跟的内容即为显示的内容。
说到这里,便应该再来说说FrontPage了。新版的FrontPage98提供了相当多的功能,它不仅可以制作网页,还可以轻松地插入VBScript脚本语言,在后面我们会经常用到它。其实VBScript不能算是一门真正的语言,到现在为止,VBScript还没有一个专门的编辑器和调试器,这和VB是没法相比的,但是因为VBScript是VB的一个子集,因此VBScript的内容在VB下大多都可以通过,所以我们如果要编写大段的VBScript程序,可以在VB下进行编写、调试,等通过后再做稍稍的修正,就可以拿到VBScript下使用了。
即然要完整地学习这门VBScript“语言”,就要像介绍其它语言一样,从它的变量开始。
从某种意义上来讲,VBScript只有一种变量类型,即变体。也就是说,一个变量即可以代表数值,也可以用来表示一个字符串。这样好不好呢?对我们来说是好的,因为它去掉了很多条条框框,可以让我们无忧无虑的使用变量,但对于程序本身来说,是不利的,因为它大大限制了程序的执行效率(但是我们可以不管它,只要好用就行了)。如果要定义一个变量,可用Dim语句:
Dim a,b
便定义了两个变量a和b。如果你不愿意写这句话,也可以在没有进行定义的前提下直接使用变量,但我们不提倡这样做,因为一方面现在的编程语言都讲究规规矩矩,如果你编的程序拿给别人看,乱七八糟的你也没面子,另一方面,也就是最重要的,它将给你的调试带来麻烦。下例就是一个麻烦:
Dim a,b,c
A=10
B=20
C=a+bb
Msgbox c
我的本意是求出a+b的值,但是结果却是10而不是30,这是因为变量bb因为没有定义过,因此使用它的默认值0。
有一个办法可以使你强制定义变量,就是在程序的首部加上一句“Option Explicit”,这样,如果象上例那样出现了bb之流没定义过的变量,程序就会出错,等待你去修改,而不是仅仅给出一个错误的结果。
上面我提到,“从某种意义上来讲,VBScript只有一种变量类型”,也就是说,在另一意义上来讲,VBScript还可有多种变量类型,不过要使用强制转换手段。经过相应的转换函数转换后,我们可以使用整数、长整数、字符串、单精度、双精度等类型。
I.CInt()、CLng()、CSng()、CDbl()四个函数是用来把一个变量转换成整型、长整型、单精度型和双精度型。比如:Cint("10")=10, CLng("65537")=65537 ,CDbl("3.5")=3.5。这四种类型是有区别的,首先CInt()、CLng()是把变量转换成整数,其中CInt()是一般的整数,它占两个字节,而CLng()是把变量转换成一个长整数,它占用四个字节。用整数可以表示的范围是-32768~32767,而长整型的范围可增加到-2147483648~2147483647,怎么样,好长吧,因此,如果转换的结果如果不在整型可以表达的范围之内的时候,就要考虑用长整型。CSng()、CDbl()都是小数转换函数,它们可以把一个变量转换成一个小数,差别仅在于精度不同,如果对精度要求不高,可以采用单精度型,如果对精度要求很高,则就要采用双精度型。不过,它们两种都能表示出很大范围的数,如果没有特殊要求,单精度数据已能满足我们的需要了。请看下例:
option explicit
Dim a,b,c
A="10"
B="20"
C=clng(a)+clng(b)
Msgbox c
最后输出结果为30,如果我们将C=clng(a)+clng(b)一句改为C=a+b,那么最后结果应该是1020,因为C的作用是将两个字符串加在了一起,即为1020;如果改写为C=clng(a+b)的话,最后结果也是1020,因为它是先把字符串进行相加,然后再把所得到的串转换成相应的数字。
II.CStr()是将一个变量转换成一个字符串,如果上例改写成如下形式:
option explicit
Dim a,b,c
A=10
B=20
C=CStr(a)+CStr(b)
Msgbox c
则最后的结果等于1020,而不是30,为什么呢,因为它是先将数值转换成字符串,然后再进行相加的。
III.Cbool()是将一个表达式的值转换成逻辑值“真”或“假”。转换的规则是如果表达式为0则结果为假,如果为非零则结果为真,因此对于字符串来说,它的结果永远为真。反过来,如果把逻辑真看成数值的话,那么它等于-1,逻辑假为0。看下列表达式:
A=10
B=10
C=CBool(a) 结果为True
C=Cbool(CStr(a)) 结果为true
C=Cbool(a)+Cbool(b) 结果为-2
对于前两个结果,很好理解,但是第三个呢,是因为Cbool(a)和Cbool(b)均为true,再进行加法运算时,自动转换成整数,即-1和-1进行相加,得出了结果-2
IV.Cdate()函数可以将一个变量转换成一个日期型变量,如:Cdate("1999-2-25")便是一个日期型结果。转换的意义在于我们可以正确地判断两个日期的先后顺序,对于两个字符串“1999-2-2”和“1999-2-3”来说,是“1999-2-2”<“1999-2-3”,而当转换后变成了Cdate(“1999-2-2”)>Cdate(“1999-2-3”),道理很明显,2号是在3号的前面。
V.以上介绍了一些转换函数,也提到了VBScript中的数据类型,其中最重要的当属字符串型了。HTML的大部分任务是显示指定内容的字符串,由于VBScript的加入,更使得字符串处理功能加倍“强壮”。通过VBScript函数,我们可以对字符串进行载取、相加等操作。
Left、Right是对字符串进行左截或右截。请看示例:
A="123456789"
B=left(a,3)
Msgbox b
C=right(a,3)
Msgbox c
这样得出的结果是b="123",c="789"。
如果我们要载取一个字符串中间的几个字符,可以用Mid函数,如C=mid(a,4,3)得出的结果是c="456"。
求一个字符串的长度用的是Len函数,比如说Len("1234567")=7。
VI.数组:
VBScript也象其它编程语言一样,提供了数组操作。定义一个数组的格式如下:
Dim a(10)
即定义了一个数组,数组的名称是a ,而它的元素是从0到10 共11个。下面我们来给这11个元素分别赋一个值:
For I=0 to 10
a(I)=I
Next
11个元素的值分别是0,1,… ,10。如果想要定义其它类型的数组,按照上面的格式做稍微的修改就可以了。
2.上面介绍的是VBScript的变量,我们必须结合其它内容才能充分学好它。下面我们来说一下VBScript中又一个要点:分支与循环。
I.分支指的是If … Then… Else…End if结构的条件判断语句。
如下面的程序:
a =inputbox("你今年多大了")
if Cint(a)<20 then
msgbox "你是一个小同志"
else
msgbox "你不是一个小同志"
end if
上例中用到了一个函数InputBox(),它的作用是接收从键盘上输入的字符串,比如上例我如果输入20,则a="20"。此例的思路是由用户输入一个年龄值,然后判断它的大小。如果它小于20,则输出"你是一个小同志",否则输出"你不是一个小同志"。
此例如果简化成下面的形式:
if Cint(a)<20 then
msgbox "你是一个小同志"
end if
则只对输入值小于20的时候有响应,而对“否则”的内容不做回答,要是你输入的年龄值是40,你会发现程序根本就不理你。还可以进一步简化成
a =inputbox("你今年多大了")
if Cint(a)<20 then msgbox "你是一个小同志"
而将end if省略。但是由于这种写法不便于阅读,因此我希望大家能够按照要求写好每一步。
再对上例进行一下改造:
a =inputbox("你今年多大了")
if Cint(a)<10 then
msgbox "你是一个小孩子"elseif cint(a)<20 then
msgbox "你是一个小同志"
elseif cint(a)<40 then
msgbox "你在青年"elseif cint(a)<50 then
msgbox "你在中年"
else
msgbox "你已上了年纪"end if
还有一类分支结构是Select … Case… End Select。举个例子来说明一下:我们要根据输入的数字来确定现在是几月份。
Dim a,mon
a =inputbox("现在是几月份?")
select case cint(a)
case 1
mon="一"
case 2
mon="二"
case 3
mon="三"
case 4
mon="四"
case 5
mon="五"
case 6
mon="六"
case 7
mon="七"
case 8
mon="八"
case 9
mon="九"
case 10
mon="十"
case 11
mon="十一"
case 12
mon="十二"
end select
msgbox "现在是" + mon +"月份"
这个例子如果也用If … Then 来完成,恐怕要多写不少的代码吧!Select结构还有一种用法,请看下例:
Dim a,quarter
a =inputbox("现在是几月份?")
select case cint(a)
case 1,2,3
quarter="一"
case 4,5,6
quarter="二"
case 7,8,9
quarter="三"
case 10,11,12
quarter="四"
end select
msgbox "现在是第" + quarter +"季度"
这个例子中,我们可以根据输入的月份来确定现在是处在第几个季度。
If分支和Select分支都是十分有用的,我们可以根据不同的需要来选用不同的方法,这样才能充分发挥VBScript 的作用。
II.For … Next循环:
VBScript的循环主要有For … Next循环和Do While … Loop循环两种,我们先来讲一下For … Next循环。请看下例:
dim i,sum
for i=1 to 100
sum=sum+i
next
msgbox sum
此例是计算从
1到100这100个数的和,结果是5050,我们从小就在珠算上玩这个游戏。如果要计算从1到1000的和,很简单,只要把上例中的100改为1000就行了。请再看一个例子:dim i,sum
for i=1 to 100 step 2
sum=sum+inext
msgbox sum
这个例子是用来计算从1到100之间的奇数的和。如果要计算从1到100间偶数的和,只要把循环条件改成for i=2 to 100 step 2就可以了。
Step为步长之意,即规定循环变量每变化一次时的增量值,如果不写,则默认为1。我们甚至可以把Step的值定为负值,如下例,依然可以实现1至100间偶数的求和工作:
dim i,sum
for i=100 to 1 step -2
sum=sum+inext
msgbox sum
III.Do While … Loop循环:
For循环是规定了循环的次数进行循环,而Do While … Loop循环则是当条件满足时进行循环,否则便跳出循环,不象For循环那样严格地限定循环次数。
还以计算1到100这100个数的和为例,改用Do While … Loop循环表示为:
Dim I,sum
I=0
Do while I<100
I=I+1
Sum=sum+I
Loop
此例的结果是正确的。但是如果我们把上述循环中的两行的位置变换一下,成为:
Do while I<100
Sum=sum+I
I=I+1
Loop
得出的结果将是4950而不是5050。问题出在哪了呢?就在循环的判断条件上。循环刚一开始的时候,I=0,sum=sum+I=0,当I=99时,sum=sum+99,然后I=I+1=100,已经不再满足循环的条件,因此就退出了循环。也就是说,同样循环了100次,但是执行的是从0到99的累加,而不是从1到100的累加。
两种循环方式同样是各有所长的,我们也应该根据实际情况来决定用哪种方式,千万不能生搬硬套。
3.VBScript的自定义函数:
自定义函数包括子程序和函数两部分,它们两者的区别在于函数有返回值,而子程序没有。从本质上来说,两者没有太大的区别。
我们先来举一个例子来说明一下子程序:
<Script language="vbscript">
<!--
option explicit
dim a
sub age()
a=inputbox("请输入你的年龄:")
end sub
age
msgbox a
-->
</script>
此例把输入年龄这个功能做成一个子程序,在主程序里调用,调用的格式也很简单,只要写出子程序的名字即可,就象调用一个内部命令一样省事。
函数和子程序类似,只是它能够返回一个值。我们来编一个求两个数中较大值的函数:
dim a,b,c
a=10
b=20
c=max(a,b)
msgbox c
function max(x,y)
if x<y then
max=y
else
max=x
end if
end function
此例中的max()函数即是我们自己编写的求较大值的函数,它里边有两个参数,使用时只要放入两个参数就可以了。还有一点要注意的是函数的返回格式:我们的函数名是max,最后只要写上max=…就可给这个函数一个返回值了。
到此,我们介绍了VBScript的大部分的语法内容,这部分虽然没有什么意思,但是它是你的其它工作的前提,如果没有坚实的语法基础,其它什么工作都做不好,希望大家能够多多地练习。
VB是一门面向对象的程序语言,VBScript也不例外(起码它用到了对象的概念)。面向对象给编程带来了很多的益处,这在VBScript中也得到了体现。
1.象VB一样,我们可以在窗体上加上命令按钮、文本框等控件(对象),如果你使用的是FrontPage,那你的工作量很小,只要按照所见即所得的风格将控件摆放在正确的位置就可以了,如果你想用记事本等编辑器直接编辑网页,那你可要费一番力气。
在介绍其它对象之前,我先来说一个比较特殊的对象:定时器。它的作用是每隔一段时间就去执行一件事情,如果你学习过VB,这将是非常容易理解的。定时器的属性主要是:Enabled、Interval,Enabled表示它是否可用,而Interval是指每隔多长时间事件发生一次,它的单位是1/1000秒。
如果要加入一个定时器,最好选用FrontPage。在菜单中选择Insert-Advanced-ActiveX Control后,就会弹出一个对话框,在下拉菜单中就可以找到Timer Object。有一点千万不能忘记,就是要给它取一个名字,否则你是无法使用的。你还可以点击属性钮对其Enabled、Interval属性进行设置。现在我们来加入一个名字为"tmrLbl"时间间隔为200毫秒的定时器,在HTML的源代码中将会出现下列代码:
<object ID="tmrLbl" WIDTH="39" HEIGHT="39"
CLASSID="CLSID:59CCB4A0-727D-11CF-AC36-00AA00A47DD2">
<param name="_ExtentX" value="2064">
<param name="_ExtentY" value="2302">
<param name="Interval" value="200">
</object>
只要看一眼,就会知道用手工编写的难度了。
现在仅仅是有了一个定时器,我们还必须对它的事件进行编码,才能使用它。定时器有一个事件叫作"Timer"。每隔一段时间,就会把这个事件中的事情执行一遍。我们可以对它编程如下:
<script LANGUAGE="VBScript">
<!--
Sub tmrLbl_Timer()
Msgbox "欢迎!"
end sub
-->
</script>
请稍等片刻,先把定时器的Interval属性的值调的大一些,2000或更大,否则你会以为是病毒发作了。此程序可以每隔一段时间内出现一个对话框,显示“欢迎”字样,如果你把时间设为200,那么你可能还来不及反应,就会出现下一个对话框,结果是你不能关闭对话框,浏览器也不能关上,因此有必要把时间间隔调的大一些,使你有时间去结束它。
用和加入定时器同样的方法来加入两个标签(Microsoft Forms 2.0 Label),并取名为lblYu0和lblYu1,它们的字体可以设置的大一些,这样以便于观察,将将两个标签的Caption属性设为"Y"和"U"(设置方法同定时器控件)。然后再对定时器重新进行编程:
<script LANGUAGE="VBScript">
<!--
Sub tmrLbl_Timer()
lblyu0.forecolor=rgb(255*rnd,255*rnd,255*rnd)
lblyu1.forecolor=rgb(255*rnd,255*rnd,255*rnd)
end sub
-->
</script>
先看一下效果,嗯,不错!然后我们再来分析一下这段程序。我们用到了标签控件的前景颜色属性:ForeColor,只要对它进行改变,就可以改变标签的颜色,正如你所见。
RGB()是一个颜色函数,它有三个参数,分别表示红、绿、蓝三色的比例,0表示没有,255表示全色。要表示红色可写成RGB(255,0,0),即将红色的比例置为100%,而其它两种颜色均没有。那么要表示白色呢,即为RGB(255,255,255),黑色呢,读者可以自己考虑一下。
还有一个是“Rnd”,它表示产生一个从0至1之间的随机数,如果用Rnd*255,就可以表示出从0到255之间的随机数了。
因此上例可以显示出颜色随机变化的标签了。如果你有耐心,可以调试出更加漂亮的标签来。
3.Window
“窗体”(Window),即浏览器打开的窗口。它的对象名是Window ,它的一个重要的属性就是Status,也就是浏览器底下的状态条,这样我们就可以让状态条显示我们自己的信息了。
如果我们这样写:Window.status="于爱武的个人主页",那么窗体的状态条上就会显示相就的字符串。
Window对象有两个事件OnLoad 和OnUnLoad。加入以下代码:
<Script language="vbscript">
<!--
option explicit
sub window_onload()
msgbox "欢迎光临"
end sub
sub window_onunload()
msgbox "欢迎再来"
end sub
-->
</script>
这样,每当打开这个网页的时候,就会显示“欢迎光临”的提示信息,而当退出这个页面的时候,则会显示“欢迎再来”的告别语。
在上面介绍变量的类型的时候提到了VBScript可以定义数组,在这里你将看到数组的类型甚至可以是控件。就是标签为例,我们在窗体上来建立10个标签,分别命令名lblYu0至lblYu9,它们的Caption属性分别设为“欢”、“迎”、“光”、“临”、“我”、“的”、“个”、“人”、“主”、“页”,然后就向上面的例子一样,再加入一个定时器,并对定时器进行编码:
<script LANGUAGE="VBScript">
<!--
Dim a(9)
Set a(0)=lblYu0
… (省略)
Set a(9)=lblYu9
Sub tmrLbl_Timer()
For I=0 to 9
A(I).forecolor=rgb(255*rnd,255*rnd,255*rnd)
Next
end sub
-->
</script>
当然,如果不用数组,也完全可以实现,但是要多写很多代码,而且不便调试。
六.总结
我在上面曾多次提到FrontPage的使用,的确,它是个不错的东东,我们可用它轻松的插入控件,并可以实现VBScript脚本语言的编写,如果多多练习,肯定会使你达到事半功倍的效果。
我们已经把VBScript的内容大致的浏览了一遍,这些已经可以让你在网上小试身手了。当然如果你想成为真正的高手,这点是不够的,还要继续“深造”才行。