本书主要通过大量实例讲解VBScript与JScript编程。从本章开始我们先用5章的篇幅讲解VBScript,以后各章再讲解JScript。本章我们先来初步认识VBScript的基本情况,并学习VBScript语言的基础知识,包括该语言的数据类型、常量和变量的一些规定、表达式与运算符等。
VBScript作为一种脚本语言,可以自由嵌入任何支持该语言的应用程序中,以增强应用程序的功能,其应用领域十分广泛。本节我们通过一个实例,说明在HTML网页中使用VBScript的基本方法。
VBScript是Visual Basic程序设计语言家族中的新成员,它以Visual Basic语言为基础提供了编程的功能,在脚本开发的场合中,VBScript得到了广泛的应用,其中包括在Internet Explorer浏览器上编写客户端脚本,也包括在Internet Information Server上编写服务器端脚本。
在最初的设计中,VBScript是通过编写事件驱动的脚本来扩大客户端HTML功能,编写客户端脚本最大的优点就在于由浏览器解释执行,不需要增大服务器的负担。例如,我们可以在客户端进行输入数据有效性验证,防止浏览器将无效数据发送给服务器。这样,一方面可以减轻服务器的负担,防止服务器陷入处理大量无意义数据的工作中,同样,也可以减轻网络的阻塞;另外一方面,也能够使客户减少等待时间,在验证的时候,浏览器能够立即作出响应,而如果在服务器上进行验证,那用户则不得不在浏览器前等待,服务器的处理和网络的传输都需要耗费一定的时间。
随着IIS 3.0和ASP技术的出现,VBScript将它的功能扩展到服务器上,VBScript开发的脚本可以在服务器上解释执行。在服务器端脚本开发的过程中,使用VBScript则没有客户端脚本开发时的局限性,当客户请求页面时,页面将在服务器上执行,然后再反馈给浏览器,浏览器所获得的只是标准HTML文件,这样就可以不受到浏览器不支持的限制。和Visual Basic语言一样,VBScript语言是大小写不敏感的,例如,当我们需要在页面中引用Server对象的时候,我们使用SERVER和server都是可以的,如果我们将两个变量定义为Book和book,在C语言中,这将被视为两个不同的变量,可是在VBScript中,它们只会被视为一个变量。
VBScript使用ActiveX Script(即ActiveX脚本)与宿主应用程序对话。使用ActiveX Script,浏览器和其他宿主应用程序不再需要每个Script部件的特殊集成代码。ActiveX Script使宿主可以编译Script、获取和调用入口点及管理开发者可用的命名空间。通过ActiveX Script,语言厂商可以建立标准Script运行时语言。
VBScript可以和HTML页面完美地结合在一起,运用VBScript可以控制HTML页面,并对页面中某些事件作出响应,例如,可以在页面的表单提交时进行数据有效性验证。VBScript还提供了许多对象和浏览器的对象,运用这些对象,可以方便地进行脚本的编写,实现一些其他语言所无法实现的功能。
那么,VBScript究竟有哪些用途呢?下面我们先列举几种情况,在实际使用中,读者也许会发现,还会有更多的情况下会用到VBScript。
(1) 创建生动的用户界面。在一个制作精美的页面中,为了使页面生动活泼,往往需要按钮在被按下时作出某些响应,那应该如何处理呢?当然我们可以采用表单中的按钮,这种按钮的确能够有效地实现所要实现的功能,但这种按钮往往会破坏整个页面的和谐美观。我们也可以采用超链接来实现,但超链接只能够实现按钮被按下的结果,而不能展现按钮从按下到弹起的整个过程。运用VBScript,我们可以采用图片来实现这个功能,首先我们应该制作两幅图片,一幅是按钮正常状态的图片,一幅是按钮被按下的图片,一开始时在页面上放置正常状态的图片,当鼠标在图片上按下时,图片切换为被按下的图片,当鼠标松开时再切换为正常状态的图片,这样就能够完美地解决这个问题,既保持页面的美观,又使页面变得生动活泼。
(2) 数据有效性验证工作。当用户填写表单并提交表单数据时,可能因为用户的疏忽而有所遗漏,或者由于用户的玩笑而填入了无效的数据,对这种情况应该如何处理呢?当然,表单的数据会送往服务器上的CGI程序,我们可以在CGI程序的处理时进行数据有效性验证,然后将结果反馈给用户,但如果是用户的疏忽而引起的,那么他将等待一段时间后才能得到反馈结果,用户当然不希望有这段时间的等待;如果是用户的玩笑而引起的,Web管理员也不希望这种毫无意义的数据送到服务器上加重服务器的负担。我们可以运用VBScript在客户端进行一次数据有效性验证,不论是遗漏了某些数据,还是填入了无效数据,都可以在表单提交前检验出来,立即反馈给用户,而不将无效的数据发向服务器。
(3) 数据查找。许多页面中都有搜索的功能。当用户填入关键词后,浏览器将关键词发送给服务器,服务器上的数据库搜索引擎立即开始工作,然后将检索结果以HTML页面的形式反馈给浏览器。这种方案当然没有什么不妥,但在数据量不大的情况下,比如只是在几十条数据中进行检索,虽然它也能够实现数据查找的功能,但和用户的等待时间、服务器加重的负载相比起来,采用这种方案是否有些得不偿失呢?既然数据量不大,运用VBScript,我们可以将数据存放在页面中,用户填入关键词后并不送往服务器,而是在客户端直接进行查找,然后直接在客户端将检索结果反馈给用户。
前面已经提到,VBScript不能用来编写单独的应用程序,它必须嵌入到HTML页面中去。嵌入时必须使用SCRIPT元素将VBScript代码添加到HTML页面中。同时,VBScript代码要写在成对的<SCRIPT>标记之间。例如,以下代码为一个测试传递日期的过程:
<SCRIPT
LANGUAGE="VBScript">
<!--
Function CanDeliver(Dt)
CanDeliver = (CDate(Dt) - Now()) >
2
End Function
-->
</SCRIPT>
可以看到,代码的开始和结束部分都有<SCRIPT>标记。另外,LANGUAGE属性用于指定所使用的Script语言。由于浏览器能够使用多种Script语言,所以必须在此指定所使用的Script语言。当然,由于VBScript是IE浏览器使用的默认的脚本语言,所以当确保使用IE浏览器浏览时可以不使用LANGUAGE属性来指定VBScript,但为了能适应其他浏览器,建议用户还是指定一下。
如果我们再注意一下上述VBScript脚本,就会发现VBScript代码被加上了注释标记(<!-- 和 -->)。如:
<SCRIPT
LANGUAGE=VBScript>
<!--
VBScript Code
--
>
</SCRIPT>
加上注释标记是因为对于不支持VBScript的浏览器来说,不能识别标签<SCRIPT>,如果不加上注释的话,VBScript脚本会被作为文本而直接显示在页面上,而加入了注释标签之后,这部分不被支持的代码就将被忽略,<SCRIPT>和</SCRIPT>标签也是不能被识别的,因此一概忽略。但是对于可以识别VBScript代码的浏览器而言,即使加了注释标签,也能识别出处于注释标签内的VBScript代码。一般,我们完全不必那样做,不过为了以防万一,我们最好养成这个好习惯。
因为以上测试传递日期的示例是一个通用函数,即不依赖于任何窗体控件,所以可以将其包含在HTML页面的HEAD部分:
<HTML>
<HEAD>
<TITLE>订购</TITLE>
<SCRIPT
LANGUAGE="VBScript">
<!--
Function CanDeliver(Dt)
CanDeliver = (CDate(Dt) - Now()) >
2
End Function
-->
</SCRIPT>
</HEAD>
<BODY>
...
SCRIPT块可以出现在HTML页面的任何地方,如BODY或HEAD部分之中。然而,最好是将所有的一般目标Script代码放在HEAD部分中,以使所有Script代码集中放置。这样可以确保在BODY部分调用代码之前所有Script代码都被读取并解码。
上述规则的一个值得注意的例外情况是,在窗体中提供内部代码以响应窗体中对象的事件。例如,以下示例在窗体中嵌入Script代码以响应窗体中按钮的单击事件:
<HTML>
<HEAD>
<TITLE>测试按钮事件</TITLE>
</HEAD>
<BODY>
<FORM
NAME="Form1">
<INPUT TYPE="Button"
NAME="Button1" VALUE="单击">
<SCRIPT FOR="Button1"
EVENT="onClick" LANGUAGE="VBScript">
MsgBox "按钮被单击!"
</SCRIPT>
</FORM>
</BODY>
</HTML>
该程序运行后的界面如图2.1(a)所示,单击其中的按钮,出现图2.1(b)的画面。
(a) 运行后的效果图 (b) 单击按钮后效果
图2.1 例程运行效果图
大多数Script代码在Sub或Function过程中,仅在其他代码要调用它时执行。然而,我们也可以将VBScript代码放在过程之外、SCRIPT块之中,这类代码仅在HTML页面加载时执行一次。这样就可以在加载Web页面时初始化数据或动态地改变页面的外观。
虽然Visual Basic中有许多种数据类型,但是在VBScript中,只支持一种数据类型,即Variant。Variant是一种很特殊的数据类型,根据它使用方式的不同,可以代表各种数据类型。如果我们将一个变量赋值为数字,那么在引用这个变量的时候,它将作为数字使用;如果我们将一个变量赋值为字符串,那么我们可以对这个变量进行字符串的各种操作。在实际使用的过程中,VBScript可以根据在变量中存储的数据识别其类型。有关变量的概念和变量的赋值操作,我们随后讲解。
在VBScript识别的过程中,除了数字和字符串之外,还包括了布尔类型、时间类型、货币类型等等,我们将其称为子类型(Subtypes)。在表2.1中,列举了VBScript中的数据子类型:
表2.1 VBScript中数据子类型
类型 |
说明 |
Empty |
空类型,代表未初始化的Variant变量值,如果变量是数字,那么它为0,如果变量是字符串,那么它为长度为0的字符串 |
Null |
无效类型,这说明在变量中保存的是无效的数据 |
Boolean |
布尔类型,取值为True或者False |
Byte |
字节类型,取值范围是从0到255的整数 |
Integer |
整数类型,取值范围是从-32768到32767的整数 |
Currency |
货币类型,取值范围从-922,337,203,685,477.5808到922,337,203,685,447.5807 |
Long |
长整数类型,取值范围是从-2,147,483,648到2,147,483,647的整数 |
Single |
单精度浮点类型,负数取值范围从-3.402823E38到-1.401298E-45,正数取值范围从1.401298E-45到3.402823E38 |
Double |
双精度浮点类型,负数取值范围从-1.7779769312386232E308到-4.94065645841247E-324,正数取值范围从4.94065645841247E-324到1.7779769312386232E308 |
Date(Time) |
日期类型,可以代表从100年1月1日到9999年12月31日的日期 |
String |
字符串类型,字符串的长度是可变的,最长可达20亿个字符 |
Object |
对象类型 |
Error |
错误编号类型 |
无效类型对许多人来说,也许是比较难以理解的一种类型,它不象前面几种类型那样直观,无效类型的数据就是Null。
表2.2 VarType函数获取各种数据子类型变量的返回值
数据子类型 |
返回值 |
Empty |
0 |
Null |
1 |
Integer |
2 |
Long |
3 |
Single |
4 |
Double |
5 |
Currency |
6 |
Date(Time) |
7 |
String |
8 |
Object |
9 |
Error |
10 |
Boolean |
11 |
Variant |
12 |
DataObject |
13 |
Byte |
17 |
Array |
8192 |
例如,我们可以把Null赋值给变量theNull,其语句如下所示:
theNull = Null
一定不要把无效类型和数字类型中的0或者字符串类型中的空字符串混淆起来,Null意味着什么都没有,代表的是变量中并没有存储着有效的数据,而0代表的是一个数值,空字符串代表的是字符串长度为0,这两个值都是有效的。虽然无效类型有些令人难以理解,但在深入VBScript编程的过程中,也许你会慢慢发现,无效类型也是十分有用的一种数据类型。
我们如果需要查看变量的数据子类型,我们可以使用VarType函数获取。例如,如果我们定义了一个变量k,并且将其赋值为3,那么我们可以使用以下语句获取其类型:
VarType(k)
执行这个函数之后将会返回2,代表这个变量的子类型是整数类型,在表2.2中我们列举了使用VarType函数获取的各种数据子类型变量的返回值。