=========== 添加vbscript代码的三种方法 ============
假设已有一个名为btnSubmit的按钮,添加vbscript代码的方法有三种:
第一种,最常用:
<script language="VBScript">
private sub btnSubmit_OnClick
msgbox("OK!")
end sub
</script>
第二种,使用For/Event属性:
<script language="VBScript" for="btnSubmit" event="OnClick">
msgbox("OK!")
</script>
第三种:可以不必单独为一个事件生成一个事件处理程序,只要把事件处理的过程当作元素标记中的一个属性就可以了。需要注意,事件的处理过程的值应该用单引号括起来,而不像其他的属性值是用双引号括起来的。
<input type="submit" name="btnSubmit" value="按钮" onclick='msgbox"OK!"' language="vbscript">
========On Error Resume Next语句=========
若不使用 On Error Resume Next 语句,发生的任何运行时错误都将是致命的,即,显示错误信息并终止运行。
On Error Resume Next 会使程序从紧随产生错误的语句之后的语句继续执行,或是从紧随最近一次调用过程(该过程含有 On Error Resume Next 语句)的语句继续运行。这个语句可以不顾运行时的错误,继续执行程序,之后您可以在过程内部建立错误处理例程。所以,如果希望在例程中进行内部错误处理,则应在每一个调用的例程中执行 On Error Resume Next 语句。
==========VBScript中的错误处理功能============
严格地讲,VBScript中的错误处理功能是比较弱的,当错误发生时,它没有办法直接调用错误处理程序,它发生错误的时候并没有产生中断或提示信息的机制。在Visual Basic中,错误发生的时候可以利用On Error Goto...的语句来进行错误处理,当错误发生时,程序会自动跳转到用Goto后面的标号指示的代码处。可是VBScript中不允许这样使用。
但是利用On Error Resume Next语句,还是可以实现某种程度的错误捕捉功能,只不过所有的错误陷阱要么必须在线处理,要么只能报告程序中出现的最后一个错误。下面给出了VBScript的错误处理基本框架。
Sub MySub()
On Error Resume Next
........
'在线处理
if Err.Number=? then
........
end if
'报告脚本遇到的上一个错误的信息
if Err.Number<>0 then
MsgBox Err.Description
end if
End Sub
注意,当使用On Error Resume Next语句后,除了最后一个错误,前面发生过的错误都已经被清除了,所以无法知道发生过的所有错误。为了能够及时处理,建议采用在线处理方法。
============Err对象的Raise方法==========
Err对象的Raise方法用于引发特定的错误。
可以用下面的程序显示错误的描述
On Error Resume Next
Err.Raise 6 '产生溢出错误。
MsgBox ("Error # " & CStr(Err.Number) & " " & Err.Description)
Err.Clear '清除错误。
========ActiveX==========
ActiveX是使Web页面丰富多彩的好方法,虽然HTML控件提供了基本的可视化操作(如按钮等),但却缺乏那些用户已经熟悉的可视化功能,而通过加入一些通用的(或者自己开发的)ActiveX控件,用户就能获得常见的计算机应用程序的感觉。用<object>标签使用ActiveX控件。id属性指定控件的名字,然后是ActiveX控件的ID号。如果浏览者的客户机上没有该控件,就要用CodeBase指定下载这一控件的源站点位置,如http://www.mysite.com/controls/mycontrol.ocx,除了指明控件的扩展名为.ocx以外,不需要提供别的什么信息。接下来是用<param>标记添加参数。一个典型的程序段如下:
<object id="objUserActiveX" classid="clsid:7823A620-9DD9-11CF-A662-00AA00C066D2">
<param name="..." value="...">
<param name="..." value="...">
</object>
如果开发者不想让浏览者知道其<param>标记中的参数,该内容会被编码,然后以data属性写入<object>标记,如:
<object id="objUserActiveX" classid="clsid:7823A620-9DD9-11CF-A662-00AA00C066D2" data="..........">
==========FileSystemObject对象=============
FileSystemObject (FSO) 对象模式,允许对大量的属性、方法和事件,使用较熟悉的 object.method 语法,来处理文件夹和文件。
FSO 对象模式使文件处理变得很容易。在处理文件时,主要的目标是以易于访问的格式把数据存储在有效的空间和资源中。这就要求能够创建文件,插入和改变数据,以及输出(读取)数据。因为把数据存储在数据库中,如 Access 或 SQL 服务器,会给应用程序增加很大的开销,所以把数据存储在二进制或文本文件中可能是最有效的解决方案。可能不希望有该开销,或者数据访问要求可能不需要与功能完备的数据库相关联的所有额外功能。
FSO 对象模式包含在 Scripting 类型库中,该库位于 Scrrun.dll 文件中。因而,要使用 FSO 对象模式,必须把 Scrrun.dll 放在 Web 服务器的适当系统目录中。
在 VBScript 中,使用下面的代码来创建 FileSystemObject 的一个实例:
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
FileSystemObject 对象模式中的某些功能是多余的。例如,可以用 FileSystemObject 对象的 CopyFile 方法,也可以用 File 对象的 Copy 方法来复制文件。这两种方法功能是相同的;两种方法能使编程更灵活。
要访问现有文件,则使用 FileSystemObject 对象中的GetFile
方法:
Dim fso, f1
Set fso = CreateObject("Scripting.FileSystemObject")
Set f1 = fso.GetFile("c:\test.txt")
一旦有了对象的句柄,就可以访问它的属性。要找出最后一次修改文件的时间,则使用下面的 VBScript 语法:
Response.Write "File last modified: " & f1.DateLastModified
创建空文本文件的方法是用 CreateTextFile 方法。 下面的示例示范了在 VBScript 中如何用这种方法来创建文本文件:
Dim fso, f1
Set fso = CreateObject("Scripting.FileSystemObject")
Set f1 = fso.CreateTextFile("c:\testfile.txt", True)
要打开现有的文件,则使用 FileSystemObject 对象的 OpenTextFile 方法。
要写数据到打开的文本文件,则根据下表所述任务使用 TextStream 对象的 Write、WriteLine 或 WriteBlankLines 方法。
下面的 VBScript 例子示范了如何打开文件,并向文件添加数据,然后关闭文件:Sub CreateFile()
Dim fso, tf
Set fso = CreateObject("Scripting.FileSystemObject")
Set tf = fso.CreateTextFile("c:\testfile.txt", True)
' 写一行,并且带有新行字符。
tf.WriteLine("Testing 1, 2, 3.")
' 向文件写三个新行字符。
tf.WriteBlankLines(3)
' 写一行。
tf.Write ("This is a test.")
tf.Close
End Sub
要从文本文件读取数据,则使用 Read、ReadLine 或 ReadAll 方法。下表描述了不同的任务应使用哪种方法。
如果使用 Read 或 ReadLine 方法,并且想跳过数据的特殊部分,则使用 Skip 或 SkipLine 方法。read 方法的结果文本存在一个字符串中,该字符串可以显示在一个控件中,也可以用字符串函数(如 Left、Right 和 Mid)来分析,连接等等。下面的 VBScript 示例示范了如何打开文件,和如何写数据到文件中并从文件读取数据:
Sub ReadFiles
Dim fso, f1, ts, s
Const ForReading = 1
Set fso = CreateObject("Scripting.FileSystemObject")
Set f1 = fso.CreateTextFile("c:\testfile.txt", True)
' 写一行。
Response.Write "Writing file <br>"
f1.WriteLine "Hello World"
f1.WriteBlankLines(1)
f1.Close
' 读取文件的内容。
Response.Write "Reading file <br>"
Set ts = fso.OpenTextFile("c:\testfile.txt", ForReading)
s = ts.ReadLine
Response.Write "File contents = '" & s & "'"
ts.Close
End Sub
==============“Cookie”技术=============
术语“Cookie”表示的是赋给客户应用程序的字符串。“Cookie”一词来源于“magic cookie”UNIX编程概念,有时又被叫做“记号”(token)。一般来说,使用“记号”这个术语对国人来说,要比“Cookie”一词更容易理解一些。
Cookie是一个字符串,一般包含许多组变量名及变量的值,各组名和值之间用分号分隔,并且分号后还跟一个空格,变量名与变量值之间用等号分隔,一个典型的Cookie字串如下:
value1=100; value2=good; sale50
用Document对象的Cookie属性返回当前的Cookie字符串。
用document.Cookie="value1=100"的方式为Cookie赋值,如果Cookie中有这个变量,将用新值替换,如果Cookie中没有这个变量,就会为它创建一个变量。
以上的Cookie技术将变量及变量值存储在内存中,而不是硬盘中。所有的页面共用一个Cookie空间,如果页面A与页面B分别在Cookie中写入了数据,则无论在哪个页面中用document.cookie都可以显示出各页面所有的Cookie数据。只要有一个IE窗口打开就不会丢失Cookie,一旦所有的IE窗口都关闭,则所有的Cookie都被清除。
下面是我自己编写的读取Cookie变量的函数。
<script language="VBScript">
function ReadCookie(pCook)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'本函数用来读取Cookie中的数据。
'流程:先删去Cookie中pCook变量前面的字串,再删去pCook变量后面的字串,就是pCook的值。
'输入:要读取的变量名。
'输出:该变量名的值。如果没有该变量的值,为其赋初值。
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
dim whereis_pCook '要查找的pCook标记名在Cookie中的起始位置
dim howlong_pCook '要查找的pCook标记名的长度
dim howlong_cookie '整个Cookie的长度
dim whereis_FenHao '查找endstring中的分号(;)的起始位置
dim endstring '存放临时字串,该字串经处理最后得到pCook的值
whereis_pCook = Instr(Document.Cookie,pCook)
if whereis_pCook = 0 then
'如果当前Cookie中没有该pCook值,就为其赋初值
select case pCook
case "value1"
document.Cookie="value1=100"
endstring="100"
case "value2"
document.Cookie="value2=good"
endstring="good"
case "value3"
document.Cookie="value3=sale50"
endstring="sale50"
end select
else
howlong_pCook = len(pCook)
howlong_cookie=len(document.cookie)
'从Cookie中pCook的值开始到Cookie最后的字串。
'要注意,Cookie在各值之间用分号分隔,并且分号后还跟一个空格,所以下面的语句中有“+1”
'另外,各变量名与变量之间用等号隔,所以下面的语句中有“-1”
'当然,以上两个量相互抵消,但为了更好地理解本语句,故仍保留
endstring = right(document.cookie,howlong_cookie - whereis_pCook + 1 - howlong_pCook - 1)
whereis_FenHao=instr(endstring,";")
'如果没有找到分号,说明此变量是最后一个,所以endstring就是最终的结果;
'如果找到分号,就取分号前面的字串,得到最终结果。
if whereis_FenHao <> 0 then
endstring=left(endstring,whereis_FenHao - 1)
end if
end if
ReadCookie=endstring
end function
</script>
==========日历控件============
操作系统:Windows2000 Professional
在FrontPage2000下名为“Calendar控件9.0”,classid="clsid:8E27C92B-1264-101C-8A2F-040224009C02"
可以用Calendar.year,Calendar.month,Calendar.day调用该控件的年月日值,当日历中改变年月日时分别触发Calendar_NewYear(),Calendar_NewMonth(),Calendar_NewDay()事件。
要注意,在下拉列表中选择了年或月后,Calendar.year,Calendar.month,Calendar.day三个值均会被清零。
=========关于VB的颜色常数============
在VBScript中使用VBS的颜色常数会出现意想不到的颜色,比如document.bgcolor=vbYellow
不会将页面背景显示成黄色,而是淡蓝色。
原因在于VBS的颜色常数表示方法与HTML中颜色的表示方法不同,VBS的颜色常数vbYellow的机内值是"hffff",VBS的本意是要它表示值为"ffff00"的颜色,但因为常数的机内值没有写成6位十六进制数,所以HTML会将其解释为"00ffff",导致出错。
关于VBS的颜色常数在页面