〖张偶 2003年1月〗
=========== 添加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的颜色常数在页面中实际显示的颜色可以在FrontPage中实验。在页面属性中选背景颜色/其它颜色,在值中直接填入VBS的颜色常数的机内值,确定后系统会把它进行转换,得到在页面中实际显示的颜色。
有些VBS的颜色常数的机内值6位数是对称的,所以会正确显示,如vbGreen(hFF00)和vbMagenta(hFF00FF)。
=================== elements 对象 ===================
private sub window_OnLoad()
for i = 0 to 6
frmRes.elements(i).value=""
next
end sub
这段窗口初始化程序将页面中frmRes表单的最前面7个元素(第0-第6个元素)的值清空,注意,不能将循环条件写成
for i=1 to 7
因为这样系统将认为是第1-第7个元素,系统对元素的标识是从0开始的。
====================== Set语句 =======================
dim TheForm
set TheForm = document.frmRes
上面语句设置用TheForm变量引用frmRes表单,可以减少书写,并使对页面的变动有更强的适应性。在程序中可以这样引用frmRes的元素:
TheForm.txtName.focus
注意:Set语句将对象引用赋给变量或属性,设置TheForm变量的语句前面必须要用set引导,否则将出错。
当使用 Set 将一个对象引用赋给变量时,并不是为变量创建对象的副本,而是创建对象的引用。可有多个对象变量引用同一个对象。因为这些变量是对象引用(不是副本),所以对对象所作的任何改动都会影响所有引用该对象的变量。
===========Location对象===========
每个窗口都有一个Location对象,定义了其包含的主页的网页地址信息。Location对象的主要属性有:
href 网页的URL
protocal 网络协议
host,hostname 主机名
pathname 路径
port 端口号
还可以使用 location.href=newURL 语句重定向页面地址。
==========window对象================
window对象的属性和方法无需指明窗口的名称,因此window对象的方法名称可以看作系统的语句。如窗口的名称可以用window.name,也可以直接用name。
status属性是状态栏提示信息,可用下面的语句改变状态栏的信息:
status="I am busy! Please wait for a miniter!"
window对象的navigate方法可以重定向页面地址。如 navigate "http://www.sina.com.cn"
============== alert和 confirm 语句 =================
alert "比尔正在认真地进行一项生物试验"
window对象的alert方法用来显示提示文本,如上图。
window对象的confirm方法弹出一个含有“确定”和“取消”按钮的对话框,可以用分支程序处理用户的选择。如上图。 flag=prompt ("比尔正在进行生物试验吗?")
if flag then
msgbox "正在进行中……"
else
msgbox "玩去了……"
end if
========== window对象的prompt方法与InputBox函数的比较==========
window对象的prompt方法的格式为:
username=prompt ("请输入你的名字:","Jack")
第一个参数为提示信息,第二个参数为默认值。如上图。
InputBox函数可以显示更个性化的输入对话框,格式为:
username=InputBox ("请输入你的名字:","输入对话框","Jack")
第一个参数为提示信息,第二个参数为对话框标题,第三个参数为默认值。如上图。 prompt方法与InputBox函数基本上是一样的,prompt方法弹出的对话框中有"JavaScript"字样,而InputBox函数弹出的对话框中有"VBScript"字样。
=========History对象============
history对象中包含着窗口中显示过的主页的列表。
forward 方法是向前翻页,相当于IE中的“前进”按钮。back 方法是向后翻页,相当于IE中的“后退”按钮。forward和back方法均可以带参数,表示前进和后退的页数。
go 方法是转到某个页面,它的参数相对于当前页面,正数是前进,负数是后退。
length 属性是窗口显示过的窗口的总数。
如 history.back
history.go 3
=======link对象=======
用document对象的links属性可以访问link对象,links属性是一个数组,从0开始记数,包含了所有的链接对象,其中链接对象的顺序由HTML文件中的链接对象的定义决定。链接对象的属性与窗口的location对象的属性很相似。
以下程序将改变页面中第一个链接的href属性。用set语句将链接对象的名称赋给lnk变量的好处是,有些情况下是无法把每一个对象的名称写出来的(如不能用name属性为<a>标记命名),用set语句就可以引用这个对象。
set lnk=document.links(0)
lnk.href="page-1.htm"
msgbox "链接已改成 " & lnk.href
link对象的length属性,是主页中所有链接对象的个数。下面的程序将显示出网页中的所有链接。
dim msg , i , lnk
for i=0 to document.links.length-1
set lnk=document.links(i)
msg=msg & i+1 & "---" & lnk.href & vbCrlf
next
msgbox msg
=========Frame 对象====================
Frame对象包含在Window对象中,但实际上又相当于一个Window对象,它可以使用窗口对象的各种属性、方法和事件,也可以包含任何窗口所能包含的对象,包括在框架对象中嵌套的其他框架对象。
一个典型的Frame嵌套的HTML源文件,将一个窗口分成上下两部分,再将上部分成左右两部分,再将上左分成上下两部分:
<frameset cols="*,505" >
<frameset rows="80,*" >
<frame name="topFrame" src="document.write-top.htm" >
<frame name="mainFrame" src="document.write-main.htm">
</frameset>
<frame name="rightFrame" src="document.write-right.htm">
</frameset >
从当前Frame访问别的Frame,用如下的形式:
parent.FrameName.document.write "cccccccc"
无论Frame嵌套了几层,都只需一个parent,而不必像目录那样一级一级地指定。
============限制文本框只能输入数字===========
下面的程序处理文本框的OnKeyUp事件,如果按下的不是数字,将删除最后键入的字符。
程序尚未解决的问题:
1.如果按下非数字键不放,将键入一串文本,而只会删除最后一个字符。
2.如果不是在最后的位置键入非数字键,就不会纠正。
sub txtA_OnKeyUp
dim a
a=right(txtA.value,1)
if a < chr(48) or a > chr(57) then
txtA.value=left(txtA.value,len(txtA.value)-1)
end if
end sub
================== window 对象的关系 =================
===================其他 ===================
□如果在HTML中没有指定脚本语言的类型,浏览器会默认脚本语言为JavaScript。
□表单<form>中的按钮若设成submit类型,则不论其OnClick程序中有何语句,最后总要跳转到<form>中定义的<action>页面,所以,submit类型的按钮不宜做检查表单填写是否正确的按钮,因为即使检查出错误也会跳转到下一个表单,检查就失去意义了。可以将其移到<form>外作为独立的按钮,或者将其类型设置为<button>。
□可以用MsgBox显示消息框来起到“断点”的作用。
□focus方法使焦点移到当前元素。如 TheForm.txtPhone.focus
□select方法使相应文本框中的全部文本处于被选中状态。如 TheForm.txtPhone.select
□页面中<body>与</body>之间的内容表示为:document.body.innerHTML