使用VBScript和JScript编写WEB应用程序
我心飞扬
写这篇文章的动机是看到了大家对VBScript和Javascript的讨论以及另一片类似的文章,觉得有必要将大家的想法加以整理:-),并将我在工作中产生的一些心得拿出来和大家分享,希望对大家有所帮助。当然,水平有限,错误在所难免。
Active Server Pages是Microsoft Windows DNA的重要组成部分,使用ASP我们可以很容易的构造功能强大的基于Web的应用。有很多脚本编写语言可供我们进行ASP创作,如:VBScript、JavaScript、Perl 和Rexx等,你可以从几种脚本编写语言中选择一个。本文中我们讨论微软公司所提供的两种脚本编写语言:
VBScript
JScript
首先,我想讨论的是:
一、什么时候使用VBScript 和JScript,以及两者之间的区别
VBScript 是Visual Basic的子集,全称是Microsoft Visual Basic Scripting Edition。如果你曾经用过Visual Basic或者是Visual Basic for Applications (VBA),你就会觉得非常熟悉。不过它们并不完全一样,因为VBScript是特意为在WEB中进行工作而设计的。
JScript是ECMAScript的Microsoft版本,是一组包括JScript 和JavaScript脚本编写语言的标准定义。JScript从一组编程语言如C, C++, 以及Java等之中脱离出来的。如果你以前曾经用过C或者是Java,那么JScript的结构你会觉得非常熟悉。即便你不知道这些语言也没有关系,JScript的结构一点也不难,它像C和Java一样方便而没有它们那么复杂。
微软公司在Internet Explorer和Internet Information Server (IIS)中为它们提供了ActiveX Scripting Language(ActiveX脚本编辑语言)引擎(比如vbscript.dll、jscript.dll)。
那么,什么时候选择何种语言?
我们知道,进行ASP开发无外乎要编写下列两种脚本之一:
1)服务器脚本:
在ASP页面中为IIS编写服务器脚本,无论使用那种语言都没有问题。并且微软公司的Visual InterDev对它们支持的都很好。
2)客户端脚本:
如果你想在浏览器脚本中使用VBScript,那么浏览器必须是Internet Explorer的某个版本。因为其他浏览器可能不支持VBScript。如果要建立一个公共Web站点,你无法预知用户使用的是什么浏览器,那么VBScript只能用于Internet Explorer这个限制就成问题了。
几乎所有允许编写脚本的浏览器都支持JScript。因此,如果为一个公共Web站点编写应用程序,用JScript来编写客户端脚本是很自然的选择。
影响你做决定的其他主要因素还有:
1、错误控制
在VBScript中有On Error 错误陷阱来对错误情况进行控制,如:On Error Resume Next。如果你编写的是服务器脚本,错误控制非常重要,因为脚本的运行是无人照顾的。Jscript没有这种机制。
2、格式化
VBScript有这样的功能,能够轻易地把数据,数字和货币数据格式化。JScript没有这样的功能。
3、动态执行
JScript一个非常有力的特性是:它允许你在你的脚本内动态地建立和执行脚本(eval()函数、execScript()方法等)。简而言之,在你的脚本中能够编写脚本。当你用DHTML进行工作时,这个特性是非常有用的,因为这样你就能够动态的操作DHTML的文档模型了。VBScript无此功能。例如,在客户端的Javascript里你可以使用类似这样的句法:
execScript("on error resume next:object.execWB 4, 1","VBScript");
4、面向对象
JScript使用的是一种基于原型的对象结构,允许你在脚本中定义对象。你能够往对象的原型中加入方法和属性,扩展内置对象和定制对象。例如:
//自定义对象myObject
function myObject(){
//自定义属性
this.properties1=value; //此时赋值为该属性的默认值
this.properties2;
...
//自定义方法
this.myMethod1=Method1;
this.myMethod2=Method2;
}
function Method1(arg){
//block;
}
function Method2(arg){
//block;
}
尤其有用的是该对象可通过SOM传回客户端,使得ASP编程方式更象以往的C/S结构。(我近期内可能会写一篇深入讨论SOM的文章,对该方法作详细讨论)
5、事件控制
用VBScript在Internet Explorer中控制事件很方便,就像在Visual Basic中一样。在VBScript中也能够建立一个隐含的事件处理程序,这只需要用对象事件结构形式来定义一项功能就行了,比如说隐式调用Button1_onclick。不过在Internet Explorer中,JScript没有这项功能(但在其他的JScript主机上支持这项功能)。
在Internet Explorer 中使用JScript控制事件,会要求你链接到一个对象上,而这个对象又是与事件处理程序相连的。通常,只要在鉴别事件并且有处理程序功能的对象的标签栏中指明其属性即可。如下所示:
<SCRIPT ID=clientEventHandlersJS LANGUAGE=javascript>
<!--
function button1_onclick() {
alert("button1 Clicked")
}
//-->
</SCRIPT>
<INPUT type="button" value="Button" id=button1 name=button1 LANGUAGE=javascript onclick="return button1_onclick()">
或者使用类似下面的语法:
<SCRIPT ID=clientEventHandlersJS LANGUAGE=javascript>
<!--
function window_onload() {
//Block;
}
//-->
</SCRIPT>
<SCRIPT LANGUAGE=javascript FOR=window EVENT=onload>
<!--
window_onload()
//-->
</SCRIPT>
值得注意的是,上例中LANGUAGE属性设置为“Javascript”。Internet Explorer对于"JScript" 和"Javascript"这两个名字都认识,但许多其他浏览器却只认识"Javascript",不认识"JScript" 。因此,为了保险起见,如果你不能确定该网页是用Internet Explorer来浏览,就最好用"Javascript"。
6、数据类型
VBScript和JScript的数据类型差别比较大,JScript有6种数据类型:数值型、字符串型、对象型、
布尔型、null和undefined。VBScript虽然只有一种数据类型Variant,但其子类型比较丰富。特别
是其对数值类型的精细划分使得在进行精确的数值运算时显得比较放心。且配合第2条中所讲到的
格式化功能使数据处理更加得心应手。有关这方面的文档请参阅微软的MSDN。
7、运算符
在运算符方面VBScript和JScript也有一些差别:
例如,VBScript增加了用于字符串连接的算术运算符“&”,用于对象比较的“is”运算符等。
然而JScript提供了比VBScript多得多的运算符,例如递加递减运算符“++、--”、一组位运算符
及typeof、delete等杂项运算符等。有关此方面的信息MSDN中非常详细,在此不必复述。
8、字符串处理
VBScript和Javascript的字符串处理曾经也是网友们争论的焦点,它们对字符串的处理有着本质
的不同,我之所以将这部分单独提出来,也是想引发网友们作一些较为详细的讨论。
在VBScript中字符串只是一种简单的数据类型而已,并为之提供了非常丰富的字符串处理函数,
例如:
ASC,Chr,InStr,InStrRev,Join,LCase,UCase,Left,Right,Len,LTrim,RTrim,Trim,Mid,Replace,
Space,String,Split,StrComp,StrReverse
因此有很大一部分网友认为VBScript的字符串处理功能比JScript简捷、功能强大。
不过我不这么认为。简捷是有可能的,但谈到强大,我觉得JScript功能更为强大。在JScript中,
字符串不仅是一种数据类型,更是一类特殊的对象。作为对象的方法,他不仅提供了上述
VBScript中字符串函数的几乎所有功能,而且配合正则表达式能够提供更为强劲的功能。
一种典型的应用就是字符串的模糊搜索,看下面这个例子:
我想把一篇文章中的Chen0,Chen1,chenk,Chen99等可能的拼写方法替换成JoyASP:
var txt = myTextFile.ReadAll();
var re = /chenk?\d?\d?/gi;
txt = txt.replace(re,"JoyASP");
这种用法在不能精确地预知被处理的字符串时显得尤其有用。熟悉Unix,C,C++,Perl的网友可能
对正则表达式不会陌生,关于这方面的内容请查阅相关文章。
二、在同一个网页中同时使用两种语言
在同一个网页中可以使用不同的脚本编写语言。这样做有以下几个可能的原因:
A、在一个程序中充分利用各种语言的优点。
B、可能所面对的现有编码是用你不熟悉的语言来编写的。例如,DTC是用JScript编写的,而
你熟悉的语言却是VBScript。
大部分情况下,你可以在同一个网页中混合几种脚本语言并且它们相互之间能够配合得很好。
用一种语言编写的脚本可以调用用另外一种语言编写的程序并且能够共享全局变量。不过有时
候还是会出现一点小问题,现在就此说明一下。
1、当你从VBScript中调用一个JScript函数时,注意在调用过程中要有括号,即使这项函数不
要求设置参数也需如此。例如,一个调用应该像这样:
returnValue = call_JScript_Function()
如果你忘记了加括号,那么这个函数所返回的值就不是你所希望的值,而是一个包含了函数本
身的VBScript无法解释的对象。
2、服务器脚本的执行顺序
被<% %>定界符括入的命令被称为主脚本命令,主脚本命令按顺序运行,从头到尾。当然,你可
以在一个服务器脚本中定义一个可调用的程序(函数或者是子程序)。这样的话,如果需要就
可以随时调用它们。
所有的主脚本命令必须用同一种语言来编写,也就是在网页前面的<%@ LANGUAGE=xxxxx%>指示
中所指明的脚本语言。因此,在一个主脚本命令中你不能把几种脚本语言混合起来。 你也许会
说“等一等”。在理论上,把服务器脚本放到<script>单元中是绝对可能的。就像下例一样:
<%Response.Write("I Love joyASP!")%>
<SCRIPT language=VBScript RUNAT=Server>
Response.Write("I Love 我心飞扬, too.")
</SCRIPT>
但是,这样你就会被IIS ASP处理程序的执行顺序控制。例如,如果你建立了服务器脚本并且在
IIS 4.0中运行它,你会发现执行顺序可能是这样的:
1)非缺省语言的<SCRIPT>单元脚本
2)主脚本命令
3)缺省语言的<SCRIPT>单元脚本
以上的顺序在很大程度上依赖于ActiveX脚本语言引擎的载入顺序,同时IIS中的ASP处理程序可
能在将来会有所改变。因此,我不不大赞成按这种方式书写代码,建议你是只把<SCRIPT>单元
用于函数或者子程序,或是把它仅仅用于其他与执行顺序无关的编码。
3、客户端脚本块的顺序
当你在客户端把几种语言混合使用时,<SCRIPT>块在网页中出现的顺序非常重要,有时候会影
响到它们是否能正常工作。看看下面这个简单的例子,它是在一个VBScript脚本中调用一个用
JScript编写的函数:
<SCRIPT LANGUAGE="VBScript">
' 调用一个JScript function
her = "Lucy"
loveher = JSfuncLoveher(her)
document.write("绝密情报:" & loveher)
</SCRIPT>
<SCRIPT LANGUAGE="JavaScript">
function JSfuncLoveher(arg){
return "White、飞鸟和Moslem都想泡" + her + "MM :-)";
}
</SCRIPT>
它不会起任何作用。说得更明白一点,document.write()会往网页中写入一个空的字符串。为
什么?很简单,在处理VBScript块时,下面的Java Script <SCRIPT>块还没有被读出来,没有
进行语法分析,因此网页不能使用它。当浏览器处理网页中的脚本块时,它是从上往下进行的。
在这个例子中,只需要调换一下脚本块的顺序就能够解决这个问题了。不过,事实上这类问题
并不那么常见,在大多数情况下,<SCRIPT>中包含的函数和子程序只有当整个网页被全部下载
下来并且所有的单元都可以使用之后才能够被调用。不过,你还是要记住,网页是按照一定的
顺序来处理的,不同语言的<SCRIPT>块是分别处理的。
3、区分大小写以及命名习惯
JScript是严格区别大小写的:在每个JScript的关键字,每个JScript命名空间的所有部分中,
你可以把大写和小写字母恰当的结合起来使用。这其中包括了你使用的对象模型中所有的关键
字。例如,当你使用ASP Response对象时,必须正确地使用大小写字母(如Response.Write),
否则JScript会坚决不予承认。同样,如果你为DHTML onclick事件编写一个处理程序,如果用
在Visual Basic中经常发生的随便使用大小写的形式JScript可能就不会承认。
VBScript是不区分大写和小写字母的。在某种程度上,这种不计较大小写的疏忽甚至在你用
VBScript对JScript编写的单元进行访问时都没什么问题。下面例子中给出了两个脚本。第一
个是用JScript编写的,其中还包括了一个全局变量(ctr)和一个函数(doubleMe)。第二个
脚本是用VBScript编写的,它是一个按钮处理程序,它能够调用JScript函数,并且报告全局
变量的值。
<SCRIPT LANGUAGE=javascript>
var ctr;
function doubleMe(aNumber){
if(parseInt(ctr)){
ctr = ctr + 1;
}
else{
ctr = 1;
}
return aNumber * 2;
}
</SCRIPT>
<SCRIPT LANGUAGE="vbscript">
Function btn1_onclick()
numberToDouble = 12
msgbox "The doubled number = " & DOUBLEME(numberToDouble)
msgbox "You have doubled the number " & CTR & " times."
End function
</SCRIPT>
在VBScript脚本中,很明显,我在提到doubleMe 函数和ctr变量时,没有正确使用字母的大小
写,但是程序依然运行良好。 这是一个好消息。而坏消息就是,在下面这些情况下你一定要注
意字母的大小写:如果网页中的JavaScript脚本所包含的单元只能够通过字母的大写和小写来
区分,例如,一个叫做Timer()的函数和一个叫做timer的全局变量等等。很不幸,尽管这种编
码方式不怎么好,但是有时候在你的网页中还是可能会遇到原来就存在的编码。
在一个函数调用中把JScript单元的名字作为一个字符串参数来使用
如果JScript包括的单元仅仅能够用字母的大小写来区分,那么VBScript就会把它们看成一样的
(也就是说,不区分大写和小写)。VBScript只能看看不管大小写的区别,它们是不是一样,
因此它识别出的只有一个JScript单元。换一句话说,如果VBScript首先找到的是叫做Timer()
的函数,那么它就无法找到叫做timer的全局变量了,反之也是一样。即便你在VBScript编码中
十分注意的把它们做了区别结果也是一样。因为VBScript在处理这些名字的时候认为它们只有一
种写法。不幸的是,这里没有其它的解决方法,除非在JScript的代码中不利用这些大小写之间
的微小差别来区分不同的函数名称。
除了在某些特殊的情况下,把单元名作为参数使用这种问题并不常见。特殊情况之一是在Visual
InterDev 6.0中的脚本对象模型中。下面我会把它作为一个例子来使用,你可以把它看作是相同
情况下的处理准则。
Visual InterDev 6.0的脚本对象模型都是用JScript来编写的。你也可以用VBScript来编写自己
的编码,它能够与用VBScript区分大小写方式编写的脚本对象模型一起使用。有时候,你不能够
直接调用某一方法,除非你把这个方法的名称传递到一个JScript函数中,而由函数来调用这个
方法。
一个典型的例子就是警告方法,你可以用它把一个方法绑定到一个特殊的事件上。在下面这个例
子中,一个按钮的onmouseover事件被绑定到changecaption()事件处理程序上。
<SCRIPT LANGUAGE="VBScript">
Function setAdviseMethods()
Btn1.advise("onmouseover", "changecaption()")
End Function
</SCRIPT>
因为你把这些名字作为字符串传送到一个JScript函数中,所以你必须使用正确的大小写表示。
JScript会自动用它的区分大小写的规则来检查这些名字,如果大小写不正确,就会找不到它们。
4、从VBScript 往JScript中传送数组
有时候一个VBScript程序会传送一个数组作为它的一个参数,或者作为它的返回值。你可以从JScript
中调用这个程序,不过必须把VBScript数组转换成为一个可用的JScript数组。你只要在JScript函数中
建立一个VBArray对象并且用toArray把它转换成为一个JScript数组就可以了。
注意:JScript不支持多维数组,如果原来的VBScript数组是多维的,经过toArray的转换后它会成为一
个一维的JScript数组。 在下面的例子中有一个VBScript脚本,它建立了一个数组,还有一个JScript
脚本,它将说明如何才能获得并使用这个数组:
<SCRIPT LANGUAGE="VBSCRIPT">
Function makeArrayVB()
' 建立一个 VBScript 数组
dim anArray(1,1)
anArray(0,0) = "0,0"
anArray(0,1) = "0,1"
anArray(1,0) = "1,0"
anArray(1,1) = "1,1"
makeArrayVB = anArray
End Function
<SCRIPT LANGUAGE="JavaScript">
// 在 JScript 脚本中访问 VBScript 数组
function getVBArray(){
var arrayObj;
var jsArray;
arrayObj = makeArrayVB();
jsArray = VBArray(arrayObj).toArray();
alert("VBScript array length = " + jsArray.length);
// 显示数组的内容
for(i=1;i<=jsArray.length;i++){
alert(jsArray[i-1]);
}
}
</SCRIPT>
不过,在目前的VBScript(4.0)中,反过来是无法做到的。也就是说你不能把一个 JavaScript 数组转换成
为VBScript数组。如果你非要在VBScript程序中使用JavaScript数组,你可以用下面的做法:
把JScript 数组转换成一种不同的结构,如转换成一个由分隔符限制的字符串等,这样VBScript 就能够使
用了。例如,你可以用 toString 函数把一个数组转换成一个用逗号分隔的,无限制的字符串。这样,在
VBScript 中你就能够用 Split 函数把它分成不同的单元。很明显这种方法在很多时候并不管用,不过有时
又的确有效。
以上罗里罗唆的写了一大堆,希望能对网友们有帮助,也希望就某些问题展开讨论。
最后,祝网友们 Happy Scripting!!